1

mysql で JDBC 接続プールを使用しています。これは私のコードです

    private static DataSource   _ds;

    /**
    * create the data source if it doesn't exist
    */
private DataSource getDataSource() throws FileNotFoundException,
        IOException, URISyntaxException
{
    if (_ds != null)
        return _ds;


    PoolProperties p = new PoolProperties();
    p.setUrl(url);
    p.setDriverClassName(driver);
    p.setUsername(username);
    p.setTestOnBorrow(true);
    if (password != null)
    {
        p.setPassword(password);
    }
    p.setValidationQuery(validationQuery);
    p.setJdbcInterceptors(JDBC_INTERCEPTOR);
    DataSource datasource = new DataSource();
    datasource.setPoolProperties(p);
    _ds = datasource;
    return datasource;
}

/**
 * gets a connection from the JDBC pool
 * 
 * @throws SQLException
 * @throws IOException
 * @throws FileNotFoundException
 * @throws URISyntaxException 
 */
public Connection getConnection() throws SQLException,
        FileNotFoundException, IOException, URISyntaxException
{
    Connection con = getDataSource().getConnection();
    con.setAutoCommit(false);
    return con;
}

そして、私が行う接続を使用したいときはいつでも:

con = getInstance().getConnection();
stmt = con.createStatement();
resultSet = stmt.executeQuery(selectQuery);

問題は、クエリの結果がリアルタイムではないことです。つまり、DB で何かを変更してコミットすると、Java のクエリは変更を取得しません。DB が別のアプリから変更された場合も同じことが起こります。

注 : 変更はしばらくすると反映されます。または、Tomcat を再起動すると反映されます。

私のコードに何か問題がありますか? とにかくこのエラーを修正するには?

ありがとうございました

4

3 に答える 3

3

ほとんどの場合、これはMySQLのデフォルトの分離レベルであるREPEATABLEREADが原因です。

これは、「自分の」トランザクションを終了(コミット、ロールバック)するまで、他のトランザクションによって行われた変更が表示されないことを意味します(覚えておいてください:SELECTはすでにトランザクションを開始しています)

プール内の接続が閉じられることはないため、これらのトランザクションはおそらく終了していません。選択を実行する前に、コミットまたはロールバックを発行してみてください。

永続的なソリューションの場合、接続プールを構成してデフォルトの分離を変更するか(ほとんどの場合これを許可します)、setTransactionIsolation()接続を呼び出すことによってトランザクションレベルを変更するか、MySQLのデフォルトレベルを変更します。

于 2012-05-01T12:59:08.760 に答える
-1

これは、Eclipse のようなほとんどの ide によって行われるキャッシュによるものです。そのため、すべてのキャッシュを停止してクリアしてから、コードを実行してみる必要があります。

于 2012-05-01T11:54:13.580 に答える