準備された文がキャッシュされているかどうかはどのように知っていますか?

would_like_to_be_anon:

私は、SQL Serverの2016年とTomcat libフォルダ内sqljdbc4-2.0.jarとひかりを使用しています。

次のようにDBリソースのための私の構成は次のとおりです。

<Resource name="jdbc/SQLServerDS" auth="Container" type="javax.sql.DataSource"
              username="uname"
              password="pwd"
              driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
              url="jdbc:sqlserver://server:port;DatabaseName=dbName"
              maxActive="20"
              maxIdle="10"
              validationQuery="select 1" />

次のように私のデータソースの構成は次のとおりです。

@Bean(name = "dataSource")
    public DataSource getDataSource() throws NamingException {
        HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(20);
        config.setDataSourceJNDI("java:comp/env/jdbc/SQLServerDS");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.addDataSourceProperty("useServerPrepStmts", "true");
        config.addDataSourceProperty("cacheResultSetMetadata", "true");
        config.addDataSourceProperty("useLocalSessionState", "true");
        config.addDataSourceProperty("cacheServerConfiguration", "true");
        config.addDataSourceProperty("elideSetAutoCommits", "true");
        config.addDataSourceProperty("maintainTimeStats", "false");
        return new TransactionAwareDataSourceProxy(
                new LazyConnectionDataSourceProxy(new HikariDataSource(config)));
    }

PreparedStatementのキャッシュが異なる接続のために働いているかどうか確認する方法は?

私は休止状態v4.3.10.Finalで春のコンテナ管理トランザクションを使用しています。

また、仕事へのキャッシュのために、私は2番目のレベルのキャッシュが有効になっている必要がありますか?

user7294900:

HikariCPは実際にサポートしていませんPreparedStatementのキャッシュを

他の人がPreparedStatementのキャッシュを提供します。HikariCPはしていません。どうして?

それは間違った実装と考えられています

プーリング層で文キャッシュを使用すると、アンチパターンであり、マイナスドライバが提供するキャッシュに比べてアプリケーションのパフォーマンスに影響を与えます。

説明:

接続プールの層のPreparedStatementでのみ接続ごとにキャッシュすることができます。アプリケーションが250個の一般的に実行されるクエリと20の接続のプールを持っている場合は、5000件のクエリ実行プランへの保留にデータベースを求めている - と同様にプールは、この多くのPreparedStatementとオブジェクトのその関連グラフをキャッシュする必要があります。

ほとんどの主要なデータベースのJDBCドライバはすでにPostgreSQLの、オラクル、ダービーは、MySQL、DB2、および他の多くを含む、構成することができステートメントキャッシュを持っています。JDBCドライバは、データベース固有の機能を利用するユニークな立場にあり、ほぼすべてのキャッシュの実装の接続を渡って実行計画を共有することができます。代わりに5000のメモリ内の文や関連する実行計画を、あなたの250の一般的に実行されるクエリは、データベース内の正確250実行計画になる。この手段。巧妙な実装でもPreparedStatementのはドライバレベルでメモリ内のオブジェクトを保持しているが、代わりに、単に既存のプランIDに新しいインスタンスを取り付けないでください。

あなたがそれを受け入れる場合は、キャッシュに期待し\てみてはいけません PreparedStatement

あなたはそれを拒否した場合は、使用することができますC3P0を接続プールとして

休止状態でのセカンドレベルキャッシュ、それは主に、接続プールで定義されていますが、関連する接続プロバイダを使用していません。

HikariCPは現在のHibernateの4.xと呼ばHikariConnectionProviderためのConnectionProviderのを持っています

休止状態にHikariConnectionProviderを使用するためには、あなたのhibernate.properties構成ファイルに次のプロパティを追加し4.X:

hibernate.connection.provider_class=com.zaxxer.hikari.hibernate.HikariConnectionProvider

Hibernateは4.3.6のとおり代わりHikariCPの実装を使用する必要があります休止状態からの公式ConnectionProviderのクラスが、そこにあります。クラスが呼び出されますorg.hibernate.hikaricp.internal.HikariCPConnectionProvider

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=168770&siteId=1