grails - 对于通过 JNDI 使用 tomcat 数据库资源的 Grails,应该 pooled=true 或 pooled=false

标签 grails jndi connection-pooling

当您使用 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 或 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 中的 dataSource 的属性部分将被忽略。

最佳答案

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

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

关于grails - 对于通过 JNDI 使用 tomcat 数据库资源的 Grails,应该 pooled=true 或 pooled=false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024007/

相关文章:

unit-testing - 为什么将空字符串转换为 null 传递给 Grails 2.4.0 中域对象的构造函数?

grails - java.lang.IllegalStateException : Could not find ApplicationContext, 首先正确配置 Grails

Oracle 连接未关闭

c# - 使用SniffingConnectionPool时出现Nest 2.4.6错误

grails - 为什么 Grails hasMany 列表大小错误?

grails - 在 Grails 3 中将静态文件呈现为 URI

jakarta-ee - 错误 : Need to specify class name in environment or system property

java - 没有 web.xml 的 JNDI 引用和查找资源

spring-boot - 使用带 JNDI 的嵌入式 Tomcat 的 Spring Boot

java - 动态创建一个jboss数据源连接池