1

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

Platonzaid
  • 11
  • 2
  • I have to invoke close() method to return the connection to the pool. if I don't return the connection to the pool, I create new connections constantly :/ – Platonzaid Sep 19 '19 at 05:37

0 Answers0