1

我是java新手。我有一个通过 jdbc 访问数据库的 java 类。在此类的每个方法中,我都在打开和关闭连接,这似乎会导致性能下降。我曾尝试使用 jdbc 连接池,但不知道如何继续。我创建了一个 Server.xml 和 Context.xml 文件,如下所示。

服务器.xml

<GlobalNamingResources>
  <Resource type="javax.sql.DataSource"
            name="jdbc/TestDB"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="com.mysql.jdbc.Driver"
            url=""
            username=""
            password=""
/>
 </GlobalNamingResources>

上下文.xml

<Context>
  <ResourceLink type="javax.sql.DataSource"
                name="jdbc/LocalTestDB"
                global="jdbc/TestDB"
/>
 </Context>

我创建了一个测试java类,如下所示。

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestDBConnections {

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource datasource = (DataSource) envContext.lookup("jdbc/LocalTestDB");
    Connection con = datasource.getConnection();

}    

我收到以下错误:

默认构造函数无法处理隐式超级构造函数抛出的异常类型 NamingException。必须定义一个显式的构造函数。

请帮帮我。

4

4 回答 4

1

我正在复制我的配置,它对我有用。您可以将配置更改为相同,我认为它会起作用...

上下文.xml

<ResourceLink
        global="jdbc/ManagerDB"
        name="jdbc/ManagerDB"
        type="javax.sql.DataSource"/>

服务器.xml

<Resource name="jdbc/ManagerDB"
              auth="Container"
              type="com.mchange.v2.c3p0.ComboPooledDataSource"
              factory="org.apache.naming.factory.BeanFactory"
              user="MQG7qJMthHrAYL1eoLkJlg=="
              password="Y3XTGQyJCRs9xY1/ZPvYiQ=="
              driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
              jdbcUrl="jdbc:sqlserver://;serverName=172.16.2.45;port=1433;DatabaseName=mgmt"
              preferredTestQuery="SELECT 1"
              testConnectionOnCheckout="false"
              maxPoolSize="75"  
              initialPoolSize="30" 
              numHelperThreads="5"
              maxStatementsPerConnection="1875"
              testConnectionOnCheckin="false"
              idleConnectionTestPeriod="300"
              checkoutTimeout="10000" /> 

现在下面的代码示例可用于通过 jndi 查找获取数据源

Context initContext = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/ManagerDB");

注意:1)我在资源链接中具有相同的全局值和名称值
2)我使用了 C3p0 数据源,您可以使用 tomcat 的默认数据源。

于 2013-06-14T07:20:56.547 回答
1

在 server.xml 中,我们定义了全局数据源。但是,任何上下文都不能使用此数据源。除非他们在其 context.xml 中为该全局数据源定义了资源链接。因此,您必须有一个资源链接,其“全局”属性值等同于 server.xml 中“名称”属性的值。

Auth 属性:- 指定 Web 应用程序代码是否以编程方式登录到相应的资源管理器,或者容器是否将代表应用程序登录到资源管理器。此属性的值必须是 Application 或 Container。如果 Web 应用程序将使用 Web 应用程序部署描述符中的元素,则此属性是必需的,但如果应用程序使用 a 代替,则此属性是可选的。

当您启动您的 tomcat 时,将创建此数据源,并且连接将存在于池中。您只需在已定义资源链接的上下文中使用给定的代码片段。您将从中获得所需的数据源和数据库连接。

于 2013-06-14T11:06:02.273 回答
0

请使用异常处理程序。使用 try catch 或 Throws 因为数据库连接代码。像这样使用

try
{
Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource datasource = (DataSource) envContext.lookup("jdbc/LocalTestDB");
    Connection con = datasource.getConnection();
}

catch(Exception ex)
{

}
于 2013-06-14T06:44:24.210 回答
0

maxActive这样做,我在server.xml下面的代码中提到的同样的连接限制 。

 <GlobalNamingResources>
 <Resource type="javax.sql.DataSource"
        name="jdbc/TestDB"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="com.mysql.jdbc.Driver"
        url=""
        username=""
         password=""
maxActive="100" maxIdle="30" maxWait="10000"
/>
</GlobalNamingResources>
于 2013-06-14T06:53:33.070 回答