slick使用HikariCP

介绍

快速,简单,可靠。HikariCP是一个“零开销”生产就绪JDBC连接池。大约130Kb,lib非常轻

mave引用

  • Java 8到11 maven配置:
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.3.1</version>
    </dependency>
  • Java 7 maven配置(维护模式):
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java7</artifactId>
        <version>2.4.13</version>
    </dependency>
  • Java 6 maven配置(维护模式):
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java6</artifactId>
        <version>2.3.13</version>
    </dependency>

初始化例子

    val hikariConfig = new HikariConfig()
    hikariConfig.setDriverClassName("com.mysql.jdbc.Driver")
    hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false")
    hikariConfig.setUsername("root")
    hikariConfig.setPassword("password")
    hikariConfig.setConnectionTimeout(30000)
    hikariConfig.setMaxLifetime(30 * 1000 * 60)
    hikariConfig.addDataSourceProperty("cachePrepStmts", "true")
    hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250")
    hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048")

    try {
      new HikariDataSource(hikariConfig)
    }
    catch {
      case ex: Exception =>
        logger.error("[DB connection error]", ex)
        throw ex
    }

或直接实例化HikariDataSource如此:

HikariDataSource ds = new HikariDataSource()
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test")
ds.setUsername("root")
ds.setPassword("password")
...

或基于属性文件:

HikariConfig config = new HikariConfig("/hikari.properties")
HikariDataSource ds = new HikariDataSource(config)

示例属性文件:

dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost

或基于java.util.Properties:

Properties props = new Properties()
props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource")
props.setProperty("dataSource.user", "test")
props.setProperty("dataSource.password", "test")
props.setProperty("dataSource.databaseName", "mydb")

HikariConfig config = new HikariConfig(props)
HikariDataSource ds = new HikariDataSource(config)

必需的

🔠dataSourceClassName
这是DataSourceJDBC驱动程序提供的类的名称。请参阅特定JDBC驱动程序的文档以获取此类名,或参见下表。注意不支持XA数据源。XA需要像bitronix这样的真实事务管理器 。请注意,如果您使用的jdbcUrl是“old-school”基于DriverManager的JDBC驱动程序配置,则不需要此属性 。 默认值:无

  • 要么 -

🔠jdbcUrl
此属性指示HikariCP使用“基于DriverManager的”配置。我们认为基于DataSource的配置(上面)由于各种原因(见下文)而优越,但对于许多部署而言,几乎没有显着差异。 将此属性与“旧”驱动程序一起使用时,您可能还需要设置该driverClassName属性,但首先尝试不使用该属性 。 请注意,如果使用此属性,您仍可以使用DataSource属性来配置驱动程序,实际上建议使用URL本身中指定的驱动程序参数。 默认值:无

🔠username
此属性设置从基础驱动程序获取Connections时使用的默认身份验证用户名。请注意,对于DataSources,它通过调用DataSource.getConnection(username, password)底层DataSource 以非常确定的方式工作。但是,对于基于驱动程序的配置,每个驱动程序都不同。在基于驱动程序的情况下,HikariCP将使用此属性在传递给驱动程序的调用中username设置user属性。如果这不是您所需要的,请完全跳过此方法并调用,例如。 默认值:无PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty("username", ...)

🔠password
此属性设置从基础驱动程序获取Connections时使用的默认验证密码。请注意,对于DataSources,它通过调用DataSource.getConnection(username, password)底层DataSource 以非常确定的方式工作。但是,对于基于驱动程序的配置,每个驱动程序都不同。在基于驱动程序的情况下,HikariCP将使用此属性在传递给驱动程序的调用中password设置password属性。如果这不是您所需要的,请完全跳过此方法并调用,例如。 默认值:无PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty("pass", ...)

经常使用

✅autoCommit
此属性控制从池返回的连接的默认自动提交行为。它是一个布尔值。 默认值:true

⌚ connectionTimeout
此属性控制客户端(即您)等待池中连接的最大毫秒数。如果在没有连接可用的情况下超过此时间,则将抛出SQLException。最低可接受的连接超时为250毫秒。 默认值:30000(30秒)

⌚ idleTimeout
此属性控制允许连接在池中空闲的最长时间。 此设置仅在minimumIdle定义为小于时才适用maximumPoolSize。一旦池到达连接, 空闲连接将不会退出minimumIdle。连接是否空闲退出的最大变化为+30秒,平均变化为+15秒。在此超时之前,连接永远不会被空闲。值为0表示永远不会从池中删除空闲连接。允许的最小值为10000毫秒(10秒)。 默认值:600000(10分钟)

⌚ maxLifetime
此属性控制池中连接的最长生命周期。使用中的连接永远不会退役,只有当它关闭时才会被删除。在逐个连接的基础上,应用轻微的负衰减以避免池中的大量灭绝。 我们强烈建议设置此值,它应比任何数据库或基础结构强加的连接时间限制短几秒。 值0表示没有最大寿命(无限寿命),当然主题是idleTimeout设置。 默认值:1800000(30分钟)

🔠connectionTestQuery
如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性。这适用于不支持JDBC4的“遗留”驱动程序Connection.isValid() API。这是在从池中给出连接之前执行的查询,以验证与数据库的连接是否仍然存在。再次尝试运行没有此属性的池,如果您的驱动程序不符合JDBC4,HikariCP将记录错误以通知您。 默认值:无

🔢minimumIdle
此属性控制HikariCP尝试在池中维护的最小空闲连接数。如果空闲连接低于此值并且池中的总连接数小于maximumPoolSize,则HikariCP将尽最大努力快速有效地添加其他连接。但是,为了获得最高性能和对峰值需求的响应,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接池。 默认值:与maximumPoolSize相同

🔢maximumPoolSize
此属性控制允许池到达的最大大小,包括空闲和正在使用的连接。基本上,此值将确定数据库后端的最大实际连接数。对此的合理值最好由您的执行环境决定。当池达到此大小且没有空闲连接可用时,对getConnection()的调用将connectionTimeout在超时前阻塞最多毫秒。请阅读有关连接池尺寸的信息。 默认值:10

📈metricRegistry
此属性仅可通过编程配置或IoC容器获得。此属性允许您指定池使用的Codahale / Dropwizard 实例MetricRegistry来记录各种度量标准。有关 详细信息,请参阅度量维基页面。 默认值:无

📈healthCheckRegistry
此属性仅可通过编程配置或IoC容器获得。此属性允许您指定池使用的Codahale / Dropwizard 实例HealthCheckRegistry来报告当前的健康信息。有关 详细信息,请参阅运行状况检查维基页面。 默认值:无

🔠poolName
此属性表示连接池的用户定义名称,主要显示在日志记录和JMX管理控制台中,以标识池和池配置。 默认值:自动生成

不经常使用

⌚ initializationFailTimeout
如果无法成功为初始连接添加池,则此属性控制池是否“快速失败”。任何正数都被认为是尝试获取初始连接的毫秒数; 在此期间,应用程序线程将被阻止。如果在此超时发生之前无法获取连接,则将引发异常。此超时被应用后的connectionTimeout 期。如果值为零(0),HikariCP将尝试获取并验证连接。如果获得连接但验证失败,则将引发异常并且池未启动。但是,如果无法获得连接,则池将启动,但稍后获取连接的努力可能会失败。小于零的值将绕过任何初始连接尝试,并且池将在尝试在后台获取连接时立即启动。因此,稍后获得连接的努力可能失败。 默认值:1

❎isolateInternalQueries
此属性确定HikariCP是否在其自己的事务中隔离内部池查询,例如连接活动测试。由于这些通常是只读查询,因此很少需要将它们封装在自己的事务中。此属性仅在autoCommit禁用时适用。 默认值:false

❎allowPoolSuspension
此属性控制是否可以通过JMX挂起和恢复池。这对某些故障转移自动化方案很有用。当池暂停时,调用 getConnection()将不会超时并将一直保持到池恢复为止。 默认值:false

❎readOnly
此属性控制默认情况下从池中获取的Connections是否处于只读模式。请注意,某些数据库不支持只读模式的概念,而其他数据库在Connection设置为只读时提供查询优化。您是否需要此属性在很大程度上取决于您的应用程序和数据库。 默认值:false

❎registerMbeans
此属性控制是否注册JMX管理Bean(“MBean”)。 默认值:false

🔠catalog
该属性设置默认目录为支持目录的概念数据库。如果未指定此属性,则使用JDBC驱动程序定义的缺省目录。 默认值:驱动程序默认

🔠connectionInitSql
此属性设置一个SQL语句,该语句将在每次创建新连接之后执行,然后再将其添加到池中。如果此SQL无效或引发异常,则将其视为连接失败,并将遵循标准重试逻辑。 默认值:无

🔠driverClassName
HikariCP将尝试仅通过驱动程序管理器来解析驱动程序jdbcUrl,但对于某些较旧的驱动程序,driverClassName还必须指定。除非您收到明显的错误消息,指出未找到驱动程序,否则请忽略此属性。 默认值:无

🔠transactionIsolation
此属性控制从池返回的连接的默认事务隔离级别。如果未指定此属性,则使用JDBC驱动程序定义的缺省事务隔离级别。如果您具有所有查询通用的特定隔离要求,则仅使用此属性。此属性的值是从不断的名称Connection 类,如TRANSACTION_READ_COMMITTED,TRANSACTION_REPEATABLE_READ等 默认值:驱动程序默认

⌚ validationTimeout
此属性控制连接测试活动的最长时间。该值必须小于connectionTimeout。最低可接受的验证超时为250毫秒。 默认值:5000

⌚ leakDetectionThreshold
此属性控制在记录消息之前连接可以离开池的时间量,指示可能的连接泄漏。值为0表示禁用泄漏检测。启用泄漏检测的最低可接受值是2000(2秒)。 默认值:0

➡ dataSource
此属性仅可通过编程配置或IoC容器获得。此属性允许您直接设置DataSource要由池包装的实例,而不是让HikariCP通过反射构造它。这在一些依赖注入框架中很有用。指定此属性后,dataSourceClassName将忽略该属性和所有特定于DataSource的属性。 默认值:无

🔠schema
该属性设置的默认模式为支持模式的概念数据库。如果未指定此属性,则使用JDBC驱动程序定义的默认架构。 默认值:驱动程序默认

➡ threadFactory
此属性仅可通过编程配置或IoC容器获得。此属性允许您设置java.util.concurrent.ThreadFactory将用于创建池使用的所有线程的实例。在某些受限执行环境中需要它,其中线程只能通过ThreadFactory应用程序容器提供的方式创建。 默认值:无

➡ scheduledExecutor
此属性仅可通过编程配置或IoC容器获得。此属性允许您设置java.util.concurrent.ScheduledExecutorService将用于各种内部计划任务的实例。如果向HikariCP提供ScheduledThreadPoolExecutor 实例,建议setRemoveOnCancelPolicy(true)使用。 默认值:无

遗漏的配置

正如你在上面看到的那样,HikariCP有很多“配置”,但比其他一些连接池要少。这是一种设计理念。HikariCP设计美学是极简主义。为了保持 简单,更好或更少是更多的设计理念,有些配置是故意遗漏的。

语句缓存

许多连接池,包括Apache DBCP,Vibur,c3p0和其他连接池都提供PreparedStatement缓存。HikariCP没有。为什么?

在连接池层,每个连接PreparedStatements只能缓存。如果您的应用程序有250个常用查询和20个连接池,那么您要求数据库保留5000个查询执行计划 - 同样,池必须缓存这么多及其相关的对象图。PreparedStatements

大多数主要的数据库JDBC驱动程序已经具有可以配置的Statement缓存,包括PostgreSQL,Oracle,Derby,MySQL,DB2等等。JDBC驱动程序处于利用数据库特定功能的独特位置,几乎所有缓存实现都能够跨连接共享执行计划。这意味着,而不是内存中的5000个语句和相关的执行计划,250个常用的查询会在数据库中生成250个执行计划。聪明的实现甚至不会PreparedStatement在驱动程序级别的内存中保留 对象,而只是将新实例附加到现有的计划ID。

在池化层使用语句缓存是一种反模式,与驱动程序提供的缓存相比,会对应用程序性能产生负面影响。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容