簡體   English   中英

使用連接池時出錯

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM