在 tomcat 上将 postgresql 数据库连接到应用程序 运行 时出现问题

Problems connecting a postgresql db to an app running on tomcat

我向你解释我的问题。 我尝试使用 netbeans 和 tomcat 创建一个网络应用程序。我已经创建了为前端提供服务的应用程序后端。由于使用 eclipseLink (JPA 2.1) 的持久性单元,后端连接到 postgresql 数据库并管理实体。我使用每个组件的最新版本。

现在我想在前端使用这些服务,所以我在我的项目中包含了后端的.jar。问题出在 tomcat 和数据库之间的连接上。经过几个小时的研究,我找到了这些配置文件:

web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
    <servlet-name>controleurMaintenance</servlet-name>
    <servlet-class>controleur.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controleurMaintenance</servlet-name>
    <url-pattern>/controleurMaintenance</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>connection.html</welcome-file>
</welcome-file-list>
<resource-ref>
    <res-ref-name>java:jdbc/maintenanceDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>

context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Context path="jdbc/Maintenance_webInterface">
<Resource auth="Container" name="java:comp/env/jdbc/maintenanceDB"               type="javax.sql.DataSource" user="paul" password="1234" driverClassName="org.postgresql.Driver"    url="jdbc:postgresql://localhost:5432/Maintenance_db" maxActive="20" schema="public" maxIdle="2" maxAwaits="-1" validationQuery="select true;"/>
</Context>

persistence.xml :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="MaintenancePU" transaction-type="JTA">
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:comp/env/jdbc/MaintenanceDB</jta-data-source>
    <properties>
      <property name="javax.persistence.schema-generation.database.action"     value="create"/>
    </properties>
  </persistence-unit>
</persistence>

简而言之,我试图将其视为数据源。我没碰过server.xml。我得到 javax.naming.NameNotFoundException:名称 jdbc/MaintenanceDB 未链接到此上下文。异常因我所做的更改而异。有时它似乎找到了数据库但查询失败...

如有任何帮助,我们将不胜感激。 非常感谢,如果您需要更多信息,请询问。

请尝试在您的 context.xml 文件中进行以下操作

<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="20" maxIdle="2" maxWait="-1"
              name="/maintenanceDB" password="1234" removeAbandoned="true" removeAbandonedTimeout="20"
              type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/Maintenance_db" username="paul"
              validationQuery="select true;"/> 

干杯 阿南特

除此之外还有另一种绑定 JNDI 数据源的方法

try {
            // Create initial context
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                    "org.apache.naming.java.javaURLContextFactory");
            System.setProperty(Context.URL_PKG_PREFIXES,
                    "org.apache.naming");
            InitialContext ic = new InitialContext();

            ic.createSubcontext("java:");
            ic.createSubcontext("java:comp");
            ic.createSubcontext("java:comp/env");

            // Construct DataSource for staging
            // Construct DataSource for wfms
            PGSimpleDataSource ds = new PGSimpleDataSource();
            ds.setUrl("jdbc:postgresql://localhost:5432/maintenanceDB");//you might get this from context
            ds.setUser("paul");//you might get this from context
            ds.setPassword("1234");//you might get this from context

            ic.bind("java:comp/env/maintenanceDB", wfmsds);

        } catch (NamingException ex) {
            ex.printStackTrace();
        }

可能想在 servlet init() 中添加此函数;

谢谢 阿南特