0

I am trying to setup a boneCP connection and I am getting the following error message:

Exception in thread "main" java.lang.ClassCastException: com.jolbox.bonecp.StatementHandle cannot be cast to com.mysql.jdbc.Statement

The connection seems to work fine but I get stopped out at the query.

Here is my code:

        BoneCP connectionPool = null;
    Connection connection = null;

    try {
        // load the database driver (make sure this is in your classpath!)
        Class.forName("com.mysql.jdbc.Driver");
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }

    try {
        // setup the connection pool
        BoneCPConfig config = new BoneCPConfig();
        config.setJdbcUrl("jdbc:mysql://192.126.0.0:3306/"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
        config.setUsername("root"); 
        config.setPassword("");
        config.setMinConnectionsPerPartition(5);
        config.setMaxConnectionsPerPartition(10);
        config.setPartitionCount(1);
        connectionPool = new BoneCP(config); // setup the connection pool

        connection = connectionPool.getConnection(); // fetch a connection

        if (connection != null){
            System.out.println("Connection successful!");
            Statement stmt = (Statement) connection.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 1 FROM table"); // do something with the connection.
            while(rs.next()){
                System.out.println(rs.getString(1)); // should print out "1"'
            }
        }
        connectionPool.shutdown(); // shutdown connection pool.
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
4

1 に答える 1

1

これは非常に単純です。BoneCP を使用する場合、基になるドライバーのオブジェクトに直接アクセスすることはできません。これは一般に接続プールに適用されます。通常、接続プールはリソース管理を処理するためにプロキシをオブジェクト化するためです (たとえば、接続がプールに返されたときの close ステートメント、結果セットなど)。これは特にステートメントに当てはまります。接続プールはステートメント キャッシングも提供できる (そして通常は提供する) からです。

具体的には、BoneCP を使用してラップされたステートメントに到達できるはずですStatementHandle.getInternalStatement()(ただし、それについて 100% 確信があるわけではありません)。

大きな問題は、なぜ にキャストする必要があるのか​​ということですがcom.mysql.jdbc.Statementjava.sql.Statementインターフェイスは十分ではありませんか?

于 2012-07-07T19:23:13.430 に答える