2013-09-18 2 views
0

я пишу в contex.xml:Datasource слишком много открытое соединение

<Resource name="1_db" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="root" password="tunespray2008" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/1_db"> 
<Resource name="2_db" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="root" password="tunespray2008" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/2_db"> 
<Resource name="3_db" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="root" password="tunespray2008" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/3_db"> 
<Resource name="common" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="root" password="tunespray2008" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/common"> 

Java код:

public static Connection getDBConnection(String url) 
{ 
Connection con = null; 
    try 
    { 
    Context ctx = new InitialContext(); 
    BasicDataSource ds = (BasicDataSource)tx.lookup("java:comp/env/"+url); 
    con = ds.getConnection(); 
    }catch(Exception e) {} 
    return con; 
} 

После того, что я называю:

String url ="common"; 
LoginDAO ldcom = DAOFactory.getLoginDAO(url); 
url ="1_db"; 
LoginDAO ldcom = DAOFactory.getLoginDAO(url); 
StatusDAO ldcom = DAOFactory.getStatusDAO(url); 

После этого, когда мы смотрим через JProfiler он показывает много открытых подключений, хотя мы вызываем con.close(), rs.close() или st.close().

Просьба указать, как мы можем правильно использовать Datasource?

+0

как насчет закрытия соединения в блоке finally и isn; t это плохая идея вернуть соединение в catch catch? – Satya

ответ

2

Есть 2 pojnts:

1) Allways тесных связей (и другие ресурсы DB) в финальном блоке. В вашем случае, это может быть что-то:

Connection conn = null; 
try { 
    conn = getDBConnection(xxx); 
    // do stuff with the connection 
} 
// optionally catch any errors that you can handle 
finally { 
    // close other DB resources that depend on conn, e.g. Statements, ResultSets 
    if(conn != null) try { conn.close(); } 
    catch(Exception ignore) {} 
} 

2) открытые соединения, которые вы видите, вероятно, пул соединений. Создание соединений с DB DriverManager.getConnection() - это дорогостоящий (требующий много времени) процесс. В среде сервера приложений, где есть много параллельных запросов, создание нового соединения для каждого запроса будет убийцей производительности. javax.sql.Datasource обертывает пул соединений, управляемый сервером приложений. Когда вы используете close() соединение, взятое с этого пула (Datasource) не уничтожено, а скорее к бассейну для будущего использования.

+0

catch (Exception ignore) {}? почему вы проигнорируете исключение, я не думаю, что его никогда не следует игнорировать, очистить его до журналов. – user648026

Смежные вопросы