ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 3.3\. JDBC连接 通常你希望`SessionFactory`来为你创建和缓存(pool)JDBC连接. 如果你采用这种方式, 只需要如下例所示那样,打开一个`Session`: ``` Session session = sessions.openSession(); // open a new Session ``` 一旦你需要进行数据访问时, 就会从连接池(connection pool)获得一个JDBC连接. 为了使这种方式工作起来, 我们需要向Hibernate传递一些JDBC连接的属性. 所有Hibernate属性的名字和语义都在`org.hibernate.cfg.Environment`中定义. 我们现在将描述JDBC连接配置中最重要的设置. 如果你设置如下属性,Hibernate将使用`java.sql.DriverManager`来获得(和缓存)JDBC连接 : **表 3.1\. Hibernate JDBC属性** | 属性名 | 用途 | | --- | --- | | `hibernate.connection.driver_class` | _jdbc驱动类_ | | `hibernate.connection.url` | _jdbc URL_ | | `hibernate.connection.username` | _数据库用户_ | | `hibernate.connection.password` | _数据库用户密码_ | | `hibernate.connection.pool_size` | _连接池容量上限数目_ | 但Hibernate自带的连接池算法相当不成熟. 它只是为了让你快些上手_,并不适合用于产品系统_或性能测试中。 出于最佳性能和稳定性考虑你应该使用第三方的连接池。只需要用特定连接池的设置替换 `hibernate.connection.pool_size`即可。这将关闭Hibernate自带的连接池. 例如, 你可能会想用C3P0. C3P0是一个随Hibernate一同分发的开源的JDBC连接池, 它位于`lib`目录下。 如果你设置了`hibernate.c3p0.*`相关的属性, Hibernate将使用 `C3P0ConnectionProvider`来缓存JDBC连接. 如果你更原意使用Proxool, 请参考发 行包中的`hibernate.properties`并到Hibernate网站获取更多的信息. 这是一个使用C3P0的`hibernate.properties`样例文件: ``` hibernate.connection.driver_class = org.postgresql.Driver hibernate.connection.url = jdbc:postgresql://localhost/mydatabase hibernate.connection.username = myuser hibernate.connection.password = secret hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 hibernate.c3p0.max_statements=50 hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect ``` 为了能在应用程序服务器(application server)中使用Hibernate, 应当总是将Hibernate 配置成从注册在JNDI中的`Datasource`处获得连接,你至少需要设置下列属性中的一个: **表 3.2\. Hibernate数据源属性** | 属性名 | 用途 | | --- | --- | | `hibernate.connection.datasource` | _数据源JNDI名字_ | | `hibernate.jndi.url` | _JNDI提供者的URL_ (可选) | | `hibernate.jndi.class` | _JNDI `InitialContextFactory`类_ (可选) | | `hibernate.connection.username` | _数据库用户_ (可选) | | `hibernate.connection.password` | _数据库用户密码_ (可选) | 这是一个使用应用程序服务器提供的JNDI数据源的`hibernate.properties`样例文件: ``` hibernate.connection.datasource = java:/comp/env/jdbc/test hibernate.transaction.factory_class = \ org.hibernate.transaction.JTATransactionFactory hibernate.transaction.manager_lookup_class = \ org.hibernate.transaction.JBossTransactionManagerLookup hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect ``` 从JNDI数据源获得的JDBC连接将自动参与到应用程序服务器中容器管理的事务(container-managed transactions)中去. 任何连接(connection)属性的属性名都要以"`hibernate.connnection`"开头. 例如, 你可能会使用`hibernate.connection.charSet`来指定字符集`charSet`. 通过实现`org.hibernate.connection.ConnectionProvider`接口,你可以定义属于 你自己的获得JDBC连接的插件策略。通过设置`hibernate.connection.provider_class`, 你可以选择一个自定义的实现.