I am trying to develop a parser that inserts data in Oracle XE. This small program executes 6 threads that will receive data via TCP, parsing them and inserting them into the database. I do this through the Oracle UCP.
My database connection code is as follows:
public class DatabasePool {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
private static final String USER = "user";
private static final String PASSWORD = "pass";
private static final int MAX_POOL_SIZE = 6;
private static volatile DatabasePool dbIsntance;
private static PoolDataSource pds;
private DatabasePool() { }
public synchronized static DatabasePool getInstance() {
if (dbIsntance == null) {
synchronized (DatabasePool.class) {
if (dbIsntance == null) {
dbIsntance = new DatabasePool();
}
}
}
return dbIsntance;
}
public PoolDataSource GetPoolSource() {
if (pds == null) {
pds = PoolDataSourceFactory.getPoolDataSource();
try {
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL(URL);
pds.setUser(USER);
pds.setPassword(PASSWORD);
//pds.setMaxPoolSize(MAX_POOL_SIZE);
return pds;
} catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return pds;
}
return pds;
}
}
I am inserting with this code:
@Override
public void insertList(ArrayList<Emision> emisionList) throws SQLException {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabasePool.getInstance().GetPoolSource().getConnection();
st = conn.prepareStatement(INSERT_EMISION);
for (int i = 0; i < emisionList.size(); i++) {
/* Setting statement */
st.addBatch();
}
st.executeBatch();
} catch (SQLException ex) {
System.err.println(ex.getMessage());
} finally {
if (st != null) {
try {
st.close();
} catch (SQLException ex) {
Logger.getLogger(DFDataDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (conn != null) {
conn.close();
conn = null;
}
}
}
In the first call to "insertList (ArrayList emisionList) everything is correct, but the second time this function is called in the execution, it throws the following exception:
Exception in thread "Thread-2" java.lang.NoSuchMethodError: oracle.jdbc.pooling.Pool.iterator(Z)Loracle/jdbc/pooling/PoolIterator;
at oracle.ucp.common.Core.forFirst(Core.java:255)
at oracle.ucp.common.Core.borrow(Core.java:555)
at oracle.ucp.common.UniversalConnectionPoolImpl.getAvailableConnectionHelper(UniversalConnectionPoolImpl.java:628)
at oracle.ucp.common.UniversalConnectionPoolImpl.getAvailableConnection(UniversalConnectionPoolImpl.java:595)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionWithoutCountingRequests(UniversalConnectionPoolImpl.java:228)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionAndValidate(UniversalConnectionPoolImpl.java:143)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnection(UniversalConnectionPoolImpl.java:122)
at oracle.ucp.jdbc.JDBCConnectionPool.borrowConnection(JDBCConnectionPool.java:172)
at oracle.ucp.jdbc.oracle.OracleJDBCConnectionPool.borrowConnection(OracleJDBCConnectionPool.java:613)
at oracle.ucp.jdbc.oracle.OracleConnectionConnectionPool.borrowConnection(OracleConnectionConnectionPool.java:97)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1989)
at oracle.ucp.jdbc.PoolDataSourceImpl.access$500(PoolDataSourceImpl.java:198)
at oracle.ucp.jdbc.PoolDataSourceImpl$30.build(PoolDataSourceImpl.java:4353)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1924)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1887)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1872)
at preclparser.DaoImpl.EmisionDaoImpl.insertList(EmisionDaoImpl.java:52)
I am testing with a single thread to simplify the solution of the problem.
I hope I explained the problem correctly