【问题标题】:Long open database session长时间打开的数据库会话
【发布时间】:2017-10-05 21:39:16
【问题描述】:

我们使用 websphere 作为应用服务器和 spring-data 来访问 oracle 数据库。 如果我们在我们的应用程序中调用起始页,来自三个不同框架的不同数据和大量标签将从数据库中并行加载。 现在,如果我们在打开起始页时监视数据库,则会打开和关闭不同的数据库会话。但是,三个会话(获取标签)保持打开状态,但处于非活动状态。 我认为 三个 会话,因为我有三个帧,它们都并行加载了很多标签。

websphere、spring-data 或 oracle 中是否有能够识别何时经常执行 sql 语句并保持会话打开的功能?

或者您知道为什么会话保持打开状态吗?

【问题讨论】:

    标签: oracle spring-data websphere


    【解决方案1】:

    WebSphere Application Server 数据源支持连接池和预准备语句的缓存。这是默认启用的。只要您的应用程序使用 WebSphere Application Server 数据源(通过资源注入 @Resource 或 JNDI 查找获得)并为您的 SQL 命令使用 java.sql.PreparedStatement,PreparedStatement 就会保留在缓存中并根据需要重用。从您的问题中不清楚您是想要这种行为还是要避免这种行为。如果您希望禁用所有预准备语句的缓存,您可以将数据源的 statementCacheSize 配置为 0。或者,如果您希望避免缓存仅特定的预准备语句,您可以通过编程方式设置 JDBC 可池性提示:

    preparedStatement.setPoolable(false);
    

    【讨论】:

    • 为什么数据库会话打开,如果值是 chached?每次加载不同的标签,并不总是相同。
    • WebSphere Application Server 完成的prepared statement缓存只涉及java.sql.PreparedStatement的缓存,不涉及SQL查询返回的值或参数值。
    • 我们使用 getJdbcTemplate().call(...) 连接数据库。这也使用缓存吗?我不会禁用此缓存。我只想知道为什么这个会话保持开放。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多