【问题标题】:should pooled=true or pooled=false for Grails using tomcat database resource via JNDI对于通过 JNDI 使用 tomcat 数据库资源的 Grails,应该 pooled=true 或 pooled=false
【发布时间】:2015-01-19 11:50:14
【问题描述】:

当您使用 Grails 管理 MySQL 连接时,您需要(为了处理重新连接)在 DataSource.groovy 中的属性部分:

dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
    properties {
        maxActive = -1
        minEvictableIdleTimeMillis=1800000
        timeBetweenEvictionRunsMillis=1800000
        numTestsPerEvictionRun=3
        testOnBorrow=true
        testWhileIdle=true
        testOnReturn=true
        validationQuery="SELECT 1"
    }

environments {
    production{
        dataSource {
            dbCreate = "upate"
            url = "jdbc:mysql://127.0.0.1:3306/mydb"
            username = "myuser"
            password = "mypass"
        }

    }

当你切换到使用 Tomcat 的连接池时,大多数例子都是这样的:

production {
    dataSource {
        dbCreate = "update"
        jndiName = "java:comp/env/revolve"
    }

问题 1

对于这种类型的连接(即使用 tomcat),DataSource.grovvy 中是否应该 pooled=true 或 false,或者这有关系吗?有帖子说一定是假的,有帖子说一定是真的,还有一些没有具体说明。如果设置为 True,这意味着有一个池池,但这是大多数示例所推荐的。

问题 2

属性部分是否被忽略?如果不是,建议设置哪些字段。根据我的反复试验,属性似乎被忽略了,这与 this one 之类的帖子相反。

例如使用 JNDI 时,DataSource.java 属性中的 validationQuery="SELECT 1" 似乎被忽略了。 IE。如果我重新启动数据库,Tomcat 上的应用程序将永久失去与数据库的连接。如果我因此在 Tomcat context.xml 中添加同一行:

<Resource name="revolve" auth="Container" type="javax.sql.DataSource"
    maxActive="50" maxIdle="5" maxWait="10000"
    username="myuser" password="mypass" driverClassName="com.mysql.jdbc.Driver"
    validationquery="SELECT 1;"
    url="jdbc:mysql://127.0.0.1:3306/mydb"/>

然后重启 Tomcat,现在如果我重启数据库,Tomcat 上的应用程序会继续运行。

这意味着在使用 Tomcat 的连接池时会忽略 DataSource.groovy 中数据源的属性部分。

【问题讨论】:

    标签: grails jndi connection-pooling


    【解决方案1】:

    您不想池化 JNDI 数据源,因为它是服务器上的连接池,因此您正在池化连接池。这没什么大不了的,您的本地 DataSource 只会从 Web 服务器的池中获取几个连接并为您的应用程序“重新池化”它们,但这是不必要的,因为池化的主要原因是避免获得一个真正的联系。这可能需要大约一秒钟,但不会很长时间,但会影响性能。但是 JNDI 池已经造成了延迟,所以再次池化没有任何好处。

    此外,您应该省略属性块,因为这些设置与本地连接池的工作方式有关,但如果您已经在检索池连接,则无需配置初始大小、最大大小、是否对借用/归还等、验证查询等进行测试。这些设置应在您通过 JNDI 提供的池的配置中进行,这将在 Web 服务器上完成。

    【讨论】:

    • 根据这个答案,在使用在 weblogic-server 上配置的 jndi 数据源的应用程序中,永远不会发生以下异常:weblogic.jdbc.extensions.PoolLimitSQLException。关于它正在发生,请您在这方面提供帮助吗?
    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2014-05-28
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多