http://docs के अनुसार .oracle.com/javase/7/docs/api/java/sql/Connection.html#close() :
Oracle के बजाय Mysql का उपयोग करते हुए यह परीक्षण इस तथ्य की पुष्टि करता है:
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class DBTest {
public Connection openConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
c.setAutoCommit(false);
return c;
}
@Test
public void testSO25886466() throws SQLException, ClassNotFoundException {
{
Connection c = openConnection();
PreparedStatement delete = c.prepareStatement("delete from temp");
delete.executeUpdate();
c.commit();
c.close();
}
{
Connection c = openConnection();
PreparedStatement insert = c.prepareStatement("insert into temp values ('a', 'b')");
insert.execute();
//c.commit(); as the op says, DONT commit!!
c.close(); //WITHOUT having closed the statement or committing the transaction!!
}
{
Connection c = openConnection();
PreparedStatement select = c.prepareStatement("select count(*) from temp");
select.execute();
ResultSet rs = select.getResultSet();
while(rs.next()){
assertEquals(0/*i'd expect zero here!*/, rs.getInt(1));
}
rs.close();
select.close();
c.close();
}
}
}
http://tomcat.apache.org/tomcat-7.0 के अनुसार -doc/jdbc-pool.html :
मेरा सुझाव है कि removeAbandoned
. को सेट न करें ताकि ओरेकल सर्वर साइड पर टाइमआउट के बाद कनेक्शन बंद कर दे, बजाय टॉमकैट को बंद करने के। Oracle शायद उस मामले में लेन-देन नहीं करेगा, लेकिन आपको इसका परीक्षण करने की आवश्यकता होगी।
वैकल्पिक रूप से, क्या आप removeAbandonedTimeout
को बढ़ा सकते हैं? सेटिंग, ताकि आपका प्रोग्राम समाप्त हो सके, और कोई कनेक्शन छूट न जाए?
आपके पास एक और समस्या यह है कि आपका आवेदन ओरेकल से जुड़ा हुआ है क्योंकि आप ड्राइवर कार्यान्वयन पर भरोसा कर रहे हैं जहां कल्पना में छेद है। यदि आप कर सकते हैं, तो विशिष्टताओं के विरुद्ध प्रोग्राम करें, ताकि आप अपने एप्लिकेशन को किसी भिन्न डेटाबेस में माइग्रेट करने के लिए स्वतंत्र हों, हालांकि मुझे पता है कि यह अभ्यास में कठिन है।
एक पूरी तरह से अलग समाधान एक ओपन सोर्स कनेक्शन पूल लेना होगा, और इसे एओपी इंटरसेप्टर के साथ विस्तारित करना होगा जो कॉल को close
पर रोक सकता है। और पता लगाएँ कि क्या लेन-देन किया गया है, और यदि नहीं, तो rollback
. पर कॉल करें कनेक्शन पर। हालांकि यह काफी जटिल समाधान है... :-)