我每次浏览页面的时候都会log4j 都会报出 这样的代码,,
2006-10-18 15:58:24,421 [org.springframework.beans.factory.xml.XmlBeanDefinitionReader]- INFO  Loading XML bean definitions from class path resource [applicationContext.xml]
2006-10-18 15:58:24,437 [org.springframework.context.support.ClassPathXmlApplicationContext]- INFO  Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27050004]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [DataSource,transactionManager,sessfactoryhibernate,DaoImpl]; root of BeanFactory hierarchy
2006-10-18 15:58:24,468 [org.springframework.context.support.ClassPathXmlApplicationContext]- INFO  4 beans defined in application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27050004]
2006-10-18 15:58:24,468 [org.springframework.context.support.ClassPathXmlApplicationContext]- INFO  Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@663ec]
2006-10-18 15:58:24,468 [org.springframework.context.support.ClassPathXmlApplicationContext]- INFO  Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@18a577d]
2006-10-18 15:58:24,468 [org.springframework.beans.factory.support.DefaultListableBeanFactory]- INFO  Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [DataSource,transactionManager,sessfactoryhibernate,DaoImpl]; root of BeanFactory hierarchy]
2006-10-18 15:58:24,531 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Diagram -> diagram
2006-10-18 15:58:24,625 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Faq -> faq
2006-10-18 15:58:24,656 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.DfUser -> df_user
2006-10-18 15:58:24,687 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.ProductInfo -> product_info
2006-10-18 15:58:24,718 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.News -> news
2006-10-18 15:58:24,734 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.ProductList -> product_list
2006-10-18 15:58:24,781 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Product -> product
2006-10-18 15:58:24,828 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.DownloadInfo -> download_info
2006-10-18 15:58:24,859 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Contact -> contact
2006-10-18 15:58:24,890 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.DiagramInfo -> diagram_info
2006-10-18 15:58:24,921 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.DownloadList -> download_list
2006-10-18 15:58:24,937 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Language -> language
2006-10-18 15:58:24,953 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.ListInfo -> list_info
2006-10-18 15:58:24,968 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.FaqList -> faq_list
2006-10-18 15:58:24,984 [org.hibernate.cfg.HbmBinder]- INFO  Mapping class: com.wang.dao.Productinfolist -> productinfolist以上代表什么意思呀!!
出来这些 hibernate 是不是每次调用都会堆mapping  缓存一次呀,因为我看见内存增加的好快呀 
..........2006-10-18 15:58:25,109 [org.hibernate.cfg.SettingsFactory]- INFO  Deleted entity synthetic identifier rollback: disabled
2006-10-18 15:58:25,109 [org.hibernate.cfg.SettingsFactory]- INFO  Default entity-mode: pojo
2006-10-18 15:58:25,140 [org.hibernate.impl.SessionFactoryImpl]- INFO  building session factory
2006-10-18 15:58:25,312 [org.hibernate.impl.SessionFactoryObjectFactory]- INFO  Not binding factory to JNDI, no JNDI name configured
2006-10-18 15:58:25,359 [org.hibernate.cache.UpdateTimestampsCache]- INFO  starting update timestamps cache at region: ehcache.org.hibernate.cache.UpdateTimestampsCache
2006-10-18 15:58:25,359 [org.hibernate.cache.StandardQueryCache]- INFO  starting query cache at region: ehcache.org.hibernate.cache.StandardQueryCache
2006-10-18 15:58:25,359 [org.hibernate.impl.SessionFactoryImpl]- INFO  Checking 0 named queries
2006-10-18 15:58:25,484 [org.springframework.context.support.ClassPathXmlApplicationContext]- INFO  Closing application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27050004]
2006-10-18 15:58:25,484 [org.springframework.beans.factory.support.DefaultListableBeanFactory]- INFO  Destroying singletons in factory {org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [DataSource,transactionManager,sessfactoryhibernate,DaoImpl]; root of BeanFactory hierarchy}
2006-10-18 15:58:25,484 [org.springframework.orm.hibernate3.LocalSessionFactoryBean]- INFO  Closing Hibernate SessionFactory
2006-10-18 15:58:25,484 [org.hibernate.impl.SessionFactoryImpl]- INFO  closing
在这里我看见连接应该已经关闭了呀

解决方案 »

  1.   

    个人作品,欢迎下载Hibernate固强,然用之稍烦.近常思于此而略有心得,故作此小东东以简化之.限予之技而难逃龌龊之举,望各大虾批评指正此套件虽然小,但是可以帮助你在实际项目中提高Hibernate的使用速度
    下载地址为<a href="http://www.cd-accp.net/web/hbdao.rar">http://www.cd-accp.net/web/hbdao.rar</a>此套件主要用于帮助开发人员在Hibernate环境下开发数据访问层
    为了使用此套件,你必须具备JDK1.5(或更高),并且设置你的编译器以支持5.0代码语法
    此套件提供以下功能 1.多Hibernate配置文件的支持
    2.可嵌套虚拟事务模型的支持
    3.事务边界拓展功能的支持
    4.事务隔离级别拓展功能的支持
    5.数据访问类事务处理自动注入的支持愿我的工作能减轻你的负担, 有问题可以反馈至[email protected], 祝使用愉快!
    (接下来的时间里,我将仔细研究.NET的System.Reflect.Emit名字空间以推出NHibernate版本)CSP提示
    自本年2月开始,本人开始利用非常宝贵的下班后的休息时间, 开发一套Java Web框架(CSP);目前取得阶段性成果, 不久的将来便可和大家碰面这套Java Web架构提供如下功能 1.服务端的非常像ASP.NET,提供基于视图控件的属性/事件编程模型
    2.服务端效防ASP.NET的__VIEWSTATE技术,实现页面的有状态化
    3.服务端效防ASP.NET1.1中的模板和数据绑顶功能,以及ASP.NET2.0中的母板功能
    4.服务端前台代码使用严格遵循Schema验证的XML书写,Schema验证结构可扩展.支持解析结果的缓冲和热加载功能
    5.客户端完全使用Ajax技术实现,所有的UI元素由Javascript动态生成
    6.客户端支持__VIEWSTATE隐藏字段信息的拆分和合并,在局部提交的情况下仍然配合全程的服务端工作
    7.客户端支持JavaScript文件的按需延迟下载,以达到下载的最小化如果不出意外.不久后此框架会发行面世,届时望四方朋友捧场如果有问题可以反馈到我的信箱[email protected], 谢谢你对本文挡的阅读
    陈涛,2006-10-17日于北大青鸟(成都名流)
      

  2.   

    com.wang.util.DaoImpl.findPageByQuery(DaoImpl.java:111)
            com.wang.web.IndexAction.handleRequest(IndexAction.java:46)呵呵,action直接调DAO啊(业务层就是DAO层伐?),你的配置文件应该是没有问题的,有时间来看,现标记一个。
      

  3.   

    我的数据库连接池
    源代码 
    //ConnectionPool.java package com.abner.dbconnector; import java.sql.*; import java.util.*; /** * ConnectionPool 类创建了一个对特定数据库指定大小的连接池。连接池对象 * 允许客户端指定 JDBC 驱动程序,数据库,使用数据库的用户名和密码。而且, * 客户端能指定连接池的在初始创建是产生数据库连接的数量,和指定当连接 * 不够时每次自动增加连接的数量及连接池最多的数据库连接的数量。 * * 对外提供的方法有: ConnectionPool :构造函数 * getInitialConnections: 返回连接池初始化大小 * setInitialConnections: 设置连接池初始化大小 * getIncrementalConnections: 返回连接池自动增加的增量 * setIncrementalConnections: 设置连接池自动增加的大小 * getMaxConnections :获得连接池的最大可允许的连接数 * setMaxConnections :设置连接池的最大可允许的连接数 * getTestTable :获得测试表的名字 * setTestTable :设置测试表的名字 * createPool: 创建连接池 , 线程己同步 * getConnection: 从连接池中获得一个数据库连接 * returnConnection: 返回一个连接到连接池中 * refreshConnections: 刷新连接池 * closeConnectionPool: 关闭连接池 * * * @author abnerchai Email: [email protected] * @version 1.0.0 * */ public class ConnectionPool { private String jdbcDriver = ""; // 数据库驱动 private String dbUrl = ""; // 数据 URL private String dbUsername = ""; // 数据库用户名 private String dbPassword = ""; // 数据库用户密码 private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表 private int initialConnections = 10; // 连接池的初始大小 private int incrementalConnections = 5;// 连接池自动增加的大小 private int maxConnections = 50; // 连接池最大的大小 private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为 null // 它中存放的对象为 PooledConnection 型 /** * 构造函数 * * @param jdbcDriver String JDBC 驱动类串 * @param dbUrl String 数据库 URL * @param dbUsername String 连接数据库用户名 * @param dbPassword String 连接数据库用户的密码 * */ public ConnectionPool(String jdbcDriver,String dbUrl,String dbUsername,String dbPassword) { this.jdbcDriver = jdbcDriver; this.dbUrl = dbUrl; this.dbUsername = dbUsername; this.dbPassword = dbPassword; } /** * 返回连接池的初始大小 * * @return 初始连接池中可获得的连接数量 */ public int getInitialConnections() { return this.initialConnections; } /** * 设置连接池的初始大小 * * @param 用于设置初始连接池中连接的数量 */
      

  4.   

    public void setInitialConnections(int initialConnections) { this.initialConnections = initialConnections; } /** * 返回连接池自动增加的大小 、 * * @return 连接池自动增加的大小 */ public int getIncrementalConnections() { return this.incrementalConnections; } /** * 设置连接池自动增加的大小 * @param 连接池自动增加的大小 */ public void setIncrementalConnections(int incrementalConnections) { this.incrementalConnections = incrementalConnections; } /** * 返回连接池中最大的可用连接数量 * @return 连接池中最大的可用连接数量 */ public int getMaxConnections() { return this.maxConnections; } /** * 设置连接池中最大可用的连接数量 * * @param 设置连接池中最大可用的连接数量值 */ public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; } /** * 获取测试数据库表的名字 * * @return 测试数据库表的名字 */ public String getTestTable() { return this.testTable; } /** * 设置测试表的名字 * @param testTable String 测试表的名字 */ public void setTestTable(String testTable) { this.testTable = testTable; } /** * * 创建一个数据库连接池,连接池中的可用连接的数量采用类成员 * initialConnections 中设置的值 */ public synchronized void createPool() throws Exception { // 确保连接池没有创建 // 如果连接池己经创建了,保存连接的向量 connections 不会为空 if (connections != null) { return; // 如果己经创建,则返回 } // 实例化 JDBC Driver 中指定的驱动类实例 Driver driver = (Driver) (Class.forName(this.jdbcDriver).newInstance()); DriverManager.registerDriver(driver); // 注册 JDBC 驱动程序 // 创建保存连接的向量 , 初始时有 0 个元素 connections = new Vector(); // 根据 initialConnections 中设置的值,创建连接。 createConnections(this.initialConnections); System.out.println(" 数据库连接池创建成功! "); } /** * 创建由 numConnections 指定数目的数据库连接 , 并把这些连接 * 放入 connections 向量中 * * @param numConnections 要创建的数据库连接的数目 */ private void createConnections(int numConnections) throws SQLException { // 循环创建指定数目的数据库连接 for (int x = 0; x < numConnections; x++) { // 是否连接池中的数据库连接的数量己经达到最大?最大值由类成员 maxConnections // 指出,如果 maxConnections 为 0 或负数,表示连接数量没有限制。 // 如果连接数己经达到最大,即退出。 if (this.maxConnections > 0 && this.connections.size() >= this.maxConnections) { break; } //add a new PooledConnection object to connections vector // 增加一个连接到连接池中(向量 connections 中) try{ connections.addElement(new PooledConnection(newConnection())); }catch(SQLException e){ System.out.println(" 创建数据库连接失败! "+e.getMessage()); throw new SQLException(); } System.out.println(" 数据库连接己创建 ......"); } } /** * 创建一个新的数据库连接并返回它 * * @return 返回一个新创建的数据库连接 */ private Connection newConnection() throws SQLException { // 创建一个数据库连接 
      

  5.   

    Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword); // 如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的 // 最大客户连接数目 //connections.size()==0 表示目前没有连接己被创建 if (connections.size() == 0) { DatabaseMetaData metaData = conn.getMetaData(); int driverMaxConnections = metaData.getMaxConnections(); // 数据库返回的 driverMaxConnections 若为 0 ,表示此数据库没有最大 // 连接限制,或数据库的最大连接限制不知道 //driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数目 // 如果连接池中设置的最大连接数量大于数据库允许的连接数目 , 则置连接池的最大 // 连接数目为数据库允许的最大数目 if (driverMaxConnections > 0 && this.maxConnections > driverMaxConnections) { this.maxConnections = driverMaxConnections; 


    return conn; // 返回创建的新的数据库连接 

    public synchronized Connection getConnection() throws SQLException { // 确保连接池己被创建 if (connections == null) { return null; // 连接池还没创建,则返回 null } 
    Connection conn = getFreeConnection(); // 获得一个可用的数据库连接 
    // 如果目前没有可以使用的连接,即所有的连接都在使用中 
    while (conn == null){ 
    wait(250); 
    conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果 
    //getFreeConnection() 返回的为 null 
    // 则表明创建一批连接后也不可获得可用连接 

    return conn;// 返回获得的可用的连接
    }
    private Connection getFreeConnection() throws SQLException { // 从连接池中获得一个可用的数据库连接 Connection conn = findFreeConnection(); if (conn == null) { 
    createConnections(incrementalConnections); 
    conn = findFreeConnection(); 
    if (conn == null) { 
    return null; 


    return conn; 

    private Connection findFreeConnection() throws SQLException { 
    Connection conn = null; 
    PooledConnection pConn = null; 
    // 获得连接池向量中所有的对象 
    Enumeration enum = connections.elements();
    // 遍历所有的对象,看是否有可用的连接 
    while (enum.hasMoreElements()) { 
    pConn = (PooledConnection) enum.nextElement(); 
    if (!pConn.isBusy()) { 
    // 如果此对象不忙,则获得它的数据库连接并把它设为忙 
    conn = pConn.getConnection(); 
    pConn.setBusy(true); 
    // 测试此连接是否可用 
    if (!testConnection(conn)) { 
    try{ 
    conn = newConnection(); 
    }catch(SQLException e){ 
    System.out.println(" 创建数据库连接失败! "+e.getMessage()); 
    return null; 

    pConn.setConnection(conn); 

    break; // 己经找到一个可用的连接,退出 


    return conn;// 返回找到到的可用连接 

    private boolean testConnection(Connection conn) { 
    try { 
    // 判断测试表是否存在 if (testTable.equals("")) { 
    conn.setAutoCommit(true); 
    } else {// 有测试表的时候使用测试表测试 //check if this connection is valid Statement stmt = conn.createStatement(); stmt.execute("select count(*) from " + testTable); } } catch (SQLException e) { // 上面抛出异常,此连接己不可用,关闭它,并返回 false; closeConnection(conn); return false; } // 连接可用,返回 true return true; }