当前位置: 首页 > 知识库问答 >
问题:

连接池Hibernate

越安翔
2023-03-14

以下代码:

hibernate.cfg.xml

<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">7</property>
<property name="hibernate.c3p0.max_size">53</property>
<property name="hibernate.c3p0.timeout">100</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">1000</property>
<property name="hibernate.c3p0.validate">true</property>

hibernateutil.java:

public final class HibernateUtil{  
     private static SessionFactory sessionFactory;  
        public static SessionFactory getSessionFactory()  throws MappingException  
        {  
            if(sessionFactory == null) {
                //sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
                sessionFactory = new Configuration().configure().buildSessionFactory();
            }  
            return sessionFactory;  
        } 

        public static Session openSession()  
        {  
            return getSessionFactory().openSession();  
        }  

}
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.hibernate.type.StandardBasicTypes;
import ConnectionHibernate.ConnectionHibernate;
import ConnectionHibernate.HibernateUtil;
import br.com.cuponero.bean.Cidades;

public class CidadesDao {
    private static final String TABLE = "Cidades";
    Session session;

    public CidadesDao() {
        this.session = HibernateUtil.getSessionFactory().openSession();
        this.session.beginTransaction();
    }

    /**
     * Select todos
     * @return 
     **/
    public List<Cidades> getTodos(){
          List<Cidades> lCit = null;

          try{
             Query q = session.createSQLQuery("SELECT * FROM "+TABLE)
                     .addScalar("id", StandardBasicTypes.BIG_INTEGER)
                     .addScalar("nome", StandardBasicTypes.STRING)
                     .addScalar("ddd", StandardBasicTypes.STRING)
                     .addScalar("estaoId", StandardBasicTypes.INTEGER)
                     .addScalar("ativo", StandardBasicTypes.INTEGER)

                     .setResultTransformer(Transformers.aliasToBean(Cidades.class));
             //System.out.println("list 0: "+q.list().get(0));

             lCit = q.list();
             //tx.commit();

          }catch (HibernateException e) {
             if (session!=null) session.beginTransaction().rollback();
             e.printStackTrace(); 
          }finally{
              //closeMyConnection();
              //mySessionClose();

              session.beginTransaction().commit();
          }

          return lCit;
    }

为了获得最好的帮助,当我尝试连接this Web服务时,请在Android Studio中查看my应用程序的日志:

org.hibernate.exception.internal.standardsqlexceptionconverter.convert(standardsqlexceptionconverter.java:47)org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:109)org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(sqlexceptionhelper.java:95)ne.transaction.internal.transactionimpl.begin(transactionimpl.java:52)org.hibernate.internal.sessionimpl.begintransaction(sessionimpl.java:1454)br.com.cuponero.dao.cidadesdao. (cidadesdao.java:31)br.com.cuponero.actionsdaservlet.cidadesactionservlet.getjsonregiao(cidadesactionservlet.java:35)br.com.cuponero.servlet.cidadesservlet.doPost(

根本原因java.sql.sqlexception:无法从基础数据库获取连接!com.mchange.v2.sql.sqlutils.ToSqlexception(Sqlutils.java:118)com.mchange.v2.c3p0.impl.c3p0PooledConnectionPool.CheckoutPooledConnection(C3p0PooledConnectionPool.java:689)com.mchange.v2.c3p0.impl.abstractPoolbackedDatasource.GetConnection(AbstractPoolbackedDatasource.java:140)org.hibernate.c3p0.internal.c3p0ConnectionProvider..java:237)org.hibernate.resource.transaction.backend.jdbc.internal.jdbcresourceLocalTransactionCoordinatorImpl$TransactionDriverControllimpl.Begin(jdbcresourceLocalTransactionCoordinatorImpl.java:213)org.hibernate.engine。

看到这条日志行,她说问题出在这里:br.com.cuponero.dao.cidadesdao。<>;初始化>;(CidadesDAO.java:31)有这一行的是以下代码:

This.Session.BeginTransaction();

共有1个答案

慕容恩
2023-03-14

这是直接来自堆栈跟踪:

用户cupone_plinhares已有多个“MAX_USER_CONNECTIONS”活动连接

一个显而易见的尝试是为用户cupone_plinhares增加max_user_connection

一个更好的想法是根本不使用session作为成员变量,而是使用类似于

Session session = null;
Transaction txn = null;
try {
  session = HibernateUtil.getSessionFactory().openSession();
  txn = session.beginTransaction();

  //do important stuff here

  txn.commit()
} catch ( Exception e ) {
  try { if (txn != null) txn.rollback() }
  catch (HibernateException he) { 
    he.printStackTrace(); 
    e.addSuppressed( he );
    throw e;
  }
} finally {
  try { if (session != null) session.close() }
  catch (SQLException sqle) { sqle.printStackTrace(); }
}

您可以以不同于打印到标准错误的方式记录事件,或者在txn.rollback()失败时,对传播哪个异常做出不同的决定。但是您需要开始/提交/回滚一个一致的事务,并且您应该根据需要创建会话并迅速销毁它们,而不是在生命周期不确定的成员变量中保持它们的打开状态。

连接池的意义在于使会话创建变得廉价,因此您不必处理管理持久会话的复杂性。

 类似资料:
  • 我对连接池有一些疑问。在SQL Server连接池文章中提到的内容类似于“打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池。每个进程、每个应用程序域、每个连接字符串以及使用集成安全性时、每个Windows标识将连接池化。” 现在我有了自己的windows窗体应用程序,它具有SQL连接。 > 所以当我打开应用程序时,SQL连接首次打开,并创建了一个池。所以,如果我关闭应用程序池会被自

  • 作为一个专业的服务端开发工程师,我们必须要对连接池、线程池、内存池等有较深理解,并且有自己熟悉的库函数可以让我们轻松驾驭这些不同的 池子。既然他们都叫某某池,那么他们从基础概念上讲,原理和目的几乎是一样的,那就是 复用。 以连接池做引子,我们说说服务端工程师基础必修课。 从我们应用最多的 HTTP 连接、数据库连接、消息推送、日志存储等,所有点到点之间,都需要花样繁多的各色连接。为了传输数据,我们

  • 连接池是客户端内的一个对象,主要是维持现有节点的连接。理论上来讲,节点只有死节点与活节点。 然而在现实世界中,事情绝不会这么明确。有时候节点是处在 “可能挂了但还未确认” 、 “连接超时但未知原因” 或 “最近挂过但现在可用” 的灰色地带中。而连接池的工作就是管理这些无规则的连接,并为客户端提供最稳定的连接状态。 如果一个连接池找不到一个活节点来发送查询,那么就会返回一个 NoNodesAvail

  • Swoole 在 v4 版本后内置了 Library 模块,使用 PHP 代码编写内核功能,使得底层设施更加稳定可靠,并且提供了内置协程连接池,本章节会说明如何使用对应的连接池。 也可以观看Swoole微课程视频教程学习内置连接池的使用。 ConnectionPool ConnectionPool,原始连接池,基于Channel自动调度,支持传入任意构造器(callable),构造器需返回一个连接

  • 安装 composer require hyperf/pool 为什么需要连接池? 当并发量很低的时候,连接可以临时建立,但当服务吞吐达到几百、几千的时候,频繁 建立连接 Connect 和 销毁连接 Close 就有可能会成为服务的一个瓶颈,那么当服务启动的时候,先建立好若干个连接并存放于一个队列中,当需要使用时从队列中取出一个并使用,使用完后再反还到队列去,而对这个队列数据结构进行维护的,就

  • 由于 Swoole 的常驻内存特性,所以 imi 中实现了连接池。所有的数据库、Redis连接,都通过连接池去获取。 定义连接池 连接池的配置,可以写在项目配置文件中,也可以写在服务器配置文件中。 在配置文件中有一个pools节点,里面配置的是连接池。 同步池子仅在task进程使用,异步池子在worker进程使用。一般使用时无需自行判断在哪个进程,框架会自动帮你获取对应的连接。 获取连接 获取池子

  • 连接池是一种标准技术,用于在内存中维护长时间运行的连接,以便有效地重用,并为应用程序可能同时使用的连接总数提供管理。 特别是对于服务器端Web应用程序,连接池是在内存中维护活动数据库连接“池”的标准方法,这些活动数据库连接在请求之间重复使用。 sqlAlchemy包括几个连接池实现,这些实现与 Engine . 它们还可以直接用于希望向其他普通DBAPI方法添加池的应用程序。 连接池配置 这个 E

  • 问题内容: 我似乎无法hibernate使用c3p0进行连接池,它说 hibernate配置: 问题答案: