[英]Error while using connection pooling
我是Java新手。 我有一个Java类,可通过jdbc访问数据库。 在此类的每种方法中,我都会打开和关闭连接,这似乎导致性能下降。 我尝试使用jdbc连接池,但不确定如何继续进行连接。 我创建了一个Server.xml和Context.xml文件,如下所示。
在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=""
/>
</GlobalNamingResources>
的context.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。 必须定义一个显式构造函数。
请帮我。
我正在复制我的配置,它正在为我工作。 您可以将您的配置更改为相同,我认为它将起作用...
的context.xml
<ResourceLink
global="jdbc/ManagerDB"
name="jdbc/ManagerDB"
type="javax.sql.DataSource"/>
在server.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的默认数据源。
在server.xml中,我们定义了全局数据源。 但是,任何上下文都不能使用此数据源。 除非他们在context.xml中为该全局数据源定义了资源链接。 因此,您必须具有资源链接,其“全局”属性值等于server.xml中“名称”属性的值。
Auth属性:-指定Web应用程序代码是否以编程方式登录到相应的资源管理器,或者容器是否代表该应用程序登录到资源管理器。 此属性的值必须是Application或Container。 如果Web应用程序将在Web应用程序部署描述符中使用元素,则此属性是必需的;如果应用程序使用a,则此属性是可选的。
当您启动tomcat时,将创建此数据源,并且连接将在池中存在。 您只需在已为其定义资源链接的上下文中使用给定的代码片段。 然后,您将从中获得所需的数据源和数据库连接。
请使用异常处理程序。 使用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)
{
}
这样做,就像我在下面的代码中提到的那样,在server.xml
限制maxActive
的连接。
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.