- 浏览: 297912 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
wangweiying123:
import com.sse.monitor.bean.Mes ...
一个项目看java TCP/IP Socket编程(1.3版) -
daxiaoli123:
求源码 448485223@qq.com
一个项目看java TCP/IP Socket编程(1.3版) -
jeromexf:
楼主,求源码,万分感谢(jeromexf@gmail.com) ...
一个项目看java TCP/IP Socket编程(1.3版) -
cuishen:
注意: 网上有人说IE8以下不支持Max-Age, 上面的代码 ...
Response Header Set-Cookie difference in cross browser -
zhunengfei:
刚接触socket,不是太明白,楼主的例子里面工具给的不是很全 ...
一个项目看java TCP/IP Socket编程(1.3版)
大家都知道hibernate是在JDBC基础上的封装,那么它的数据库连接是怎样实现的呢?带着这个疑问最近研究了下hibernate的源代码,代码还是比较简单的,但是做的很通用,好现在一起来看下源代码
hibernate的数据库连接类都放在org.hibernate.connection包内,对于数据库连接类hibernate称其为ConnectionProvider,对!就是连接提供者,org.hibernate.connection.ConnectionProvider只是个供hibernate使用的接口,通过该接口的getConnection()方法获得数据库连接,但是这个接口到底是怎么样实现的,或者是由谁提供的,hibernate并不关心,用户在使用hibernate的时候可以在其配置文件中指定具体的实现类(hoho,这就是面向接口编程的好处),现在看看这个接口的规范:
接下来要说的是org.hibernate.connection.ConnectionProviderFactory,望名会意,就是制造连接提供者的工厂,这个工厂类里面通过hibernate的配置反射获得具体的ConnectionProvider实现类的实例
对于ConnectionProvider接口,hibernate自己提供了一套丰富的实现
1. DatasourceConnectionProvider,这是基于WEB容器提供的JNDI数据库连接池的连接实现
2. DriverManagerConnectionProvider,这是基于JDBC的数据库连接,当然同时也实现了自己的数据库连接缓存池
3. 基于第三方项目的连接池实现,大家可以自己去看hibernate源代码:org.hibernate.connection.C3P0ConnectionProvider,以及org.hibernate.connection.ProxoolConnectionProvider。
对于hibernate的普通使用,如下代码:
每次openSession()获得一个session就建立了一条数据库连接,一个session其实就对应着一条连接
如果是使用spring和hibernate进行web开发,可能你会用到下面的代码
可以自己去看spring的源代码,这个返回的Session对象其实已经被包装后缓存到了ThreadLocal对象里
hibernate的数据库连接类都放在org.hibernate.connection包内,对于数据库连接类hibernate称其为ConnectionProvider,对!就是连接提供者,org.hibernate.connection.ConnectionProvider只是个供hibernate使用的接口,通过该接口的getConnection()方法获得数据库连接,但是这个接口到底是怎么样实现的,或者是由谁提供的,hibernate并不关心,用户在使用hibernate的时候可以在其配置文件中指定具体的实现类(hoho,这就是面向接口编程的好处),现在看看这个接口的规范:
package org.hibernate.connection; public interface ConnectionProvider { /** 初始化建立数据库连接所需要的配置 */ public void configure(Properties props) throws HibernateException; /** 获得数据库连接 */ public Connection getConnection() throws SQLException; /** 关闭数据库连接 */ public void closeConnection(Connection conn) throws SQLException; /** 释放连接提供者占用的所有资源 */ public void close() throws HibernateException; }
接下来要说的是org.hibernate.connection.ConnectionProviderFactory,望名会意,就是制造连接提供者的工厂,这个工厂类里面通过hibernate的配置反射获得具体的ConnectionProvider实现类的实例
ConnectionProvider connections; String providerClass = properties.getProperty(Environment.CONNECTION_PROVIDER); if ( providerClass!=null ) { try { log.info("Initializing connection provider: " + providerClass); //反射获得具体的ConnectionProvider实现类的实例 connections = (ConnectionProvider) ReflectHelper.classForName(providerClass).newInstance(); } catch ( Exception e ) { log.error( "Could not instantiate connection provider", e ); throw new HibernateException("Could not instantiate connection provider: " + providerClass); } } else if ( properties.getProperty(Environment.DATASOURCE)!=null ) { connections = new DatasourceConnectionProvider(); } else if ( properties.getProperty(Environment.URL)!=null ) { connections = new DriverManagerConnectionProvider(); } else { connections = new UserSuppliedConnectionProvider(); } ... return connections;
对于ConnectionProvider接口,hibernate自己提供了一套丰富的实现
1. DatasourceConnectionProvider,这是基于WEB容器提供的JNDI数据库连接池的连接实现
package org.hibernate.connection; public class DatasourceConnectionProvider implements ConnectionProvider { private DataSource ds; public void configure(Properties props) throws HibernateException { String jndiName = props.getProperty( Environment.DATASOURCE ); if ( jndiName == null ) { String msg = "datasource JNDI name was not specified by property " + Environment.DATASOURCE; log.error( msg ); throw new HibernateException( msg ); } user = props.getProperty( Environment.USER ); pass = props.getProperty( Environment.PASS ); try { //通过JNDI方式获得DataSource ds = ( DataSource ) NamingHelper.getInitialContext( props ).lookup( jndiName ); } catch ( Exception e ) { log.error( "Could not find datasource: " + jndiName, e ); throw new HibernateException( "Could not find datasource", e ); } if ( ds == null ) { throw new HibernateException( "Could not find datasource: " + jndiName ); } log.info( "Using datasource: " + jndiName ); } public Connection getConnection() throws SQLException { if (user != null || pass != null) { //获得连接 return ds.getConnection(user, pass); } else { //获得连接 return ds.getConnection(); } } }
2. DriverManagerConnectionProvider,这是基于JDBC的数据库连接,当然同时也实现了自己的数据库连接缓存池
package org.hibernate.connection; public class DriverManagerConnectionProvider implements ConnectionProvider { private String url; private Properties connectionProps; private Integer isolation; private final ArrayList pool = new ArrayList(); private int poolSize; private int checkedOut = 0; private boolean autocommit; private static final Logger log = LoggerFactory.getLogger(DriverManagerConnectionProvider.class); public void configure(Properties props) throws HibernateException { String driverClass = props.getProperty(Environment.DRIVER); //数据库连接池的大小,默认是20个 poolSize = PropertiesHelper.getInt(Environment.POOL_SIZE, props, 20); //default pool size 20 log.info("Using Hibernate built-in connection pool (not for production use!)"); log.info("Hibernate connection pool size: " + poolSize); autocommit = PropertiesHelper.getBoolean(Environment.AUTOCOMMIT, props); log.info("autocommit mode: " + autocommit); isolation = PropertiesHelper.getInteger(Environment.ISOLATION, props); if (isolation!=null) log.info( "JDBC isolation level: " + Environment.isolationLevelToString( isolation.intValue() ) ); if (driverClass==null) { log.warn("no JDBC Driver class was specified by property " + Environment.DRIVER); } else { try { // trying via forName() first to be as close to DriverManager's semantics Class.forName(driverClass); } catch (ClassNotFoundException cnfe) { try { ReflectHelper.classForName(driverClass); } catch (ClassNotFoundException e) { String msg = "JDBC Driver class not found: " + driverClass; log.error( msg, e ); throw new HibernateException(msg, e); } } } url = props.getProperty( Environment.URL ); if ( url == null ) { String msg = "JDBC URL was not specified by property " + Environment.URL; log.error( msg ); throw new HibernateException( msg ); } connectionProps = ConnectionProviderFactory.getConnectionProperties( props ); log.info( "using driver: " + driverClass + " at URL: " + url ); // if debug level is enabled, then log the password, otherwise mask it if ( log.isDebugEnabled() ) { log.info( "connection properties: " + connectionProps ); } else if ( log.isInfoEnabled() ) { log.info( "connection properties: " + PropertiesHelper.maskOut(connectionProps, "password") ); } } public Connection getConnection() throws SQLException { if ( log.isTraceEnabled() ) log.trace( "total checked-out connections: " + checkedOut ); synchronized (pool) { if ( !pool.isEmpty() ) { int last = pool.size() - 1; if ( log.isTraceEnabled() ) { log.trace("using pooled JDBC connection, pool size: " + last); checkedOut++; } //如果连接池里有空闲的连接,则返回一个连接,并将该连接从连接池里移除 Connection pooled = (Connection) pool.remove(last); if (isolation!=null) pooled.setTransactionIsolation( isolation.intValue() ); if ( pooled.getAutoCommit()!=autocommit ) pooled.setAutoCommit(autocommit); return pooled; } } log.debug("opening new JDBC connection"); //如果连接池里没有空闲的连接,则新建一个JDBC连接并返回 Connection conn = DriverManager.getConnection(url, connectionProps); if (isolation!=null) conn.setTransactionIsolation( isolation.intValue() ); if ( conn.getAutoCommit()!=autocommit ) conn.setAutoCommit(autocommit); if ( log.isDebugEnabled() ) { log.debug( "created connection to: " + url + ", Isolation Level: " + conn.getTransactionIsolation() ); } if ( log.isTraceEnabled() ) checkedOut++; return conn; } public void closeConnection(Connection conn) throws SQLException { if ( log.isDebugEnabled() ) checkedOut--; synchronized (pool) { int currentSize = pool.size(); if ( currentSize < poolSize ) { if ( log.isTraceEnabled() ) log.trace("returning connection to pool, pool size: " + (currentSize + 1) ); //如果连接池没有满,则将该连接放进连接池 pool.add(conn); return; } } log.debug("closing JDBC connection"); //如果连接池已满,则关闭该连接 conn.close(); } /** 释放连接池 */ public void close() { log.info("cleaning up connection pool: " + url); Iterator iter = pool.iterator(); while ( iter.hasNext() ) { try { ( (Connection) iter.next() ).close(); } catch (SQLException sqle) { log.warn("problem closing pooled connection", sqle); } } pool.clear(); } }
3. 基于第三方项目的连接池实现,大家可以自己去看hibernate源代码:org.hibernate.connection.C3P0ConnectionProvider,以及org.hibernate.connection.ProxoolConnectionProvider。
对于hibernate的普通使用,如下代码:
SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session = sf.openSession();
每次openSession()获得一个session就建立了一条数据库连接,一个session其实就对应着一条连接
如果是使用spring和hibernate进行web开发,可能你会用到下面的代码
Session session = org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(sessionFactory, true);
可以自己去看spring的源代码,这个返回的Session对象其实已经被包装后缓存到了ThreadLocal对象里
发表评论
-
Response Header Set-Cookie difference in cross browser
2014-07-02 21:26 8409如果你项目中需要在server端把cookie写回client ... -
struts1 redirect issue
2014-05-08 23:04 1350近日突然发现struts1 的redirect有很大的限制,它 ... -
Cookie 和 sessionStorage的区别
2014-03-18 23:21 1586expire设为null的cookie是session sco ... -
http https get post 的区别,定义/安全性/性能
2014-02-20 18:19 14646HTTP / HTTPS request 的 get / po ... -
struts1的tiles导致的response cache无法禁止的issue
2014-02-15 00:13 1500近日struts 1项目中遇到一个很怪异的问题,项目中的所有. ... -
XFS攻击一例
2013-08-13 17:50 6019XFS: Cross Frame Script (跨框架脚本) ... -
XSS攻击一例
2013-08-12 17:55 1784XSS 全称(Cross Site Scripting) 跨站 ... -
maven3 compile failed, class file not found issue
2013-07-16 18:31 1462今日maven3 build 老是失败,停在compile,报 ... -
maven plugin for eclipse 3.6+
2013-07-04 18:24 1184this for eclipse 3.6 down http: ... -
JQuery异步提交表单在Firefox button onclick事件下可能导致重复提交
2013-06-04 19:58 4863当我们处理button的onclick事件时,在onclick ... -
AJAX JQuery 提交表单乱码问题解决方案
2012-10-16 13:59 13678最近遇到AJAX/JQuery 提交form表单出现乱码的问题 ... -
hibernate多对多级联删除总结
2010-04-02 07:46 3599A. 应用场景: 一个简单的权限系统的例子: 有三张主表: ... -
iBATIS一对多/多对多N+1问题解决方案
2009-12-08 17:53 13139对于iBATIS一对多/多对多的问题,传统的办法是在一对多/多 ... -
最原始的O/R Mapping,比hibernate轻的多
2009-12-04 17:44 3528hibernate的O/R Mapping确实 ... -
Apache_WebLogic9.2.2安装及集群、SSL配置手册
2009-10-09 17:27 1581Apache_WebLogic9.2.2安装及集群、SSL配置 ... -
浅析Java web程序之客户端和服务器端交互原理
2009-09-16 21:18 47851. 协议 a. TCP/IP整体构 ... -
spring aop 事务配置总结
2009-08-06 13:47 5595以下配置基于spring 1x ... -
从源代码解读spring之DataSource实现和FactoryBean模式
2009-07-22 13:25 8034大家平日使用spring + hibernate做项目的时候大 ... -
AIX环境下JDK1.5 + WebLogic9.2.2安装配置手册
2009-01-22 13:15 2398项目中用到: 服务器:IBM 64位 小型机 操作系统:AI ... -
从源代码解读spring IOC容器
2008-09-19 09:43 4035spring IOC容器(Inversion of Contr ...
相关推荐
标题提到的是“一个好的hibernate源代码有server2008数据库”。这里我们可以理解为,这是一个关于Hibernate框架的示例项目,它使用了Microsoft SQL Server 2008作为后端数据库。Hibernate是Java开发中常用的一个对象...
Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,它为程序员提供了强大的面向对象编程能力,极大地简化了数据访问层繁琐的事务管理,使得开发人员能够更专注于业务逻辑和...
选择源代码存放的路径,例如`src/entity`,并选择之前创建的数据库连接。这样,我们就可以将Hibernate集成到项目中。 为了利用Hibernate的ORM能力,我们需要进行逆向工程,将数据库表转换为Java实体类和配置文件。...
本文将从系统需求分析、设计思路、主要功能模块实现、数据库设计以及源代码解读等角度,全面解析这个项目的各个关键知识点。 1. **系统需求分析**:在设计图书馆书库管理系统前,首要任务是明确系统的需求。这包括...
以上是对"传智巴巴运动网源代码"中可能涉及的技术栈和核心知识点的解读,实际的源代码可能会根据项目需求和开发团队选择采用不同的技术和实现方式。深入研究这套源代码,开发者可以学习到一套完整的网站开发流程,...
本篇文章将详细探讨一个基于Java的在线考试系统的各个方面,包括源代码分析、数据库设计、系统部署以及辅助学习资源。 首先,源代码是系统的核心部分。"3-源码"文件夹中包含了该在线考试系统的全部源代码,通过阅读...
这是一个基于Java技术实现的物业管理系统毕业设计项目,包含完整的源代码、数据库文件、部署文档以及部署教程视频。这个项目对于学习Java开发,尤其是对物业管理系统感兴趣的开发者或学生来说,是一份非常宝贵的参考...
**标签解读:** "Hibernate Demo 源代码"标签再次强调了这是一个关于Hibernate的演示实例,提供源代码供学习和研究。"Demo"通常包含基础功能的实现,便于初学者理解和掌握。 **压缩包子文件:** "HibernateDemo"很...
可能还涉及到使用JDBC(Java Database Connectivity)连接数据库,或者结合ORM(Object-Relational Mapping)框架如Hibernate简化数据库操作。 外文翻译部分可能是对相关领域的研究文献进行的中文解读,有助于读者...
Ant是一种流行的Java构建工具,用于自动化构建过程,如编译源代码、运行测试、生成文档等。通过将Ant的bin目录添加到系统PATH环境变量,确保了开发环境中可以无缝执行Ant脚本。 #### 构建Hibernate基础代码 接下来...
通过对"java经典源代码项目.txt"的深度解读,我们可以深入学习Java编程的最佳实践,同时也能提升我们的编程技巧和项目管理能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。在实际操作中,建议结合IDE...
在描述中提到的“NULL”可能意味着没有具体的描述信息,但我们可以从标签“源码”和“工具”中推测,这篇博文可能与某个开源工具或框架的源代码分析有关。在软件开发中,源码分析可以帮助我们理解软件的工作原理,...
【标签】"传智播客 Hibernate 源码"中的关键词强调了这是传智播客教育机构提供的教程资料,专注于对Hibernate源代码的解读。传智播客通常以其详尽的教学内容和实例教学而闻名,因此,这个源码分析很可能包含了丰富的...
【描述】"一个基于hibernate+spring+struts的学生选课系统源码"意味着开发者可以获取到完整的源代码,以便学习、研究或在此基础上进行二次开发。这种系统通常包括用户登录、课程浏览、选课操作、成绩管理等多个功能...
O'Reilly是一家知名的出版机构,以其技术书籍和参考资料著称,他们对Hibernate源代码进行了深入的分析和解读。在这个压缩包中,"examples"可能包含了多个示例项目,用于演示Hibernate的各种功能和用法。 首先,...
Hibernate是一个开放源代码的对象关系映射工具,用于Java持久化服务,它允许开发者将Java对象映射到关系数据库表中的记录,反之亦然。版本3.2在前代基础上进行了多项改进与优化,引入了更灵活的配置选项,增强了性能...
以下是对"jsp博客系统源代码"的详细解读: 1. **Servlet与JSP**:Servlet是Java Web应用中的后端处理引擎,用于接收和响应HTTP请求。JSP则是将动态内容与静态HTML结合的视图层技术。在这个博客系统中,Servlet可能...
OA办公系统源代码基于SSH框架,这是一个非常典型的Java企业级应用开发组合,SSH指的是Spring、Struts和Hibernate三个开源框架的首字母缩写。这个系统提供了全面的办公自动化功能,适用于企业的日常管理工作。 1. **...
在本项目中,“JAVA SMART系统-系统框架设计与开发(源代码+论文)”是一个基于Java技术的智能系统,它展示了如何构建一个高效、可扩展且易于维护的软件框架。这个项目不仅提供了源代码,还有一篇相关的论文,帮助读者...
源代码部分可能包括了前端界面、后端服务、数据库模型以及其他支持性文件,如配置文件、资源文件等。论文部分则可能详述了项目的背景、设计原则、架构设计、功能实现、性能优化以及可能遇到的问题和解决方案。 根据...