[英]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.