【问题标题】:how to make the jdbc mysql databse connection live如何使 jdbc mysql 数据库连接生效
【发布时间】:2015-12-13 03:15:50
【问题描述】:

下面是我的 hibernate.xml 文件这个文件,对于 sql 中的任何查询,我将使用会话工厂进行查询,但在此我使用属性名称 dataSource 引用数据库连接,因此对于我正在调用的每个查询会话工厂,并且对于每次调用,它都在调用 dataSource 并建立一个新连接,而不是我只想建立一个连接并为每个请求进行多个查询,这是可能的

我正在使用休眠进行 sql 查询

我正在使用下面的 hibernate.xml,正如我从 http://www.mkyong.com/spring/maven-spring-hibernate-mysql-example/ 学到的那样

hibernate.xml:

<property name="dataSource">
  <ref bean="dataSource"/>
</property>

<property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
     <prop key="hibernate.show_sql">true</prop>
   </props>
 </property>

 <property name="mappingResources">
<list>
       <value>resources/database/Token.xml</value>
</list>
  </property>   

</bean>

datasource.xml:

<bean id="dataSource" 
         class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="url" value="jdbc:mysql://localhost:3306/get"/>
   <property name="username" value="root"/>
   <property name="password" value="password"/>
  <property name="initialSize" value="3"/>
   <property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="3" />
</bean>

</beans>

更新:我已经建立了我的代码连接池,但是如何让它在应用程序启动时只打开一个连接并为每个请求使用相同的连接

正如您所见,每次调用会话工厂时,它都会调用 dataSource 并建立连接,我想停止它

【问题讨论】:

  • 你怎么知道它不断地重新打开新的连接?您能否附上日志以确认这一点?
  • 因为每次我认为它会重新打开连接时它都会调用dataSourse bean,所以我会检查日志并返回

标签: java mysql spring hibernate jdbc


【解决方案1】:

如果你想重用连接,你需要使用支持连接池的DataSource实现。 示例 here 用于 dbcp 库。还有Tomcat 实现。

为了使用它,您需要将库添加到依赖项中,并使用实现类和连接池的配置值更新 DataSource 的配置。

【讨论】:

  • 是的,我可以进行连接池,但是之后对于每个请求,我都会调用会话工厂,并且每次建立数据库连接时,我都需要解决方案吗?我得到了连接池的解决方案,谢谢
【解决方案2】:

两个考虑。 首先是您可以在一个xml文件中配置所有bean,不需要为hibernate和spring保留不同的文件(Spring一个就足够了)。

第二:您可以使用支持池连接和更多配置的数据源,例如C3P0。 如何声明它的一个例子是:

<bean id="yourDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/get" />
    <property name="user" value="username" />
    <property name="password" value="password" />
    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="3" />
    <property name="preferredTestQuery">
      <value>select null from dual</value>
    </property>
    <property name="testConnectionOnCheckin">
      <value>true</value>
    </property>
    <property name="idleConnectionTestPeriod">
      <value>1000</value>
    </property>
  </bean>

【讨论】:

  • 是的,我可以进行连接池,但是之后对于每个请求,我都会调用会话工厂,并且每次建立数据库连接时,我都需要解决方案吗?我得到了连接池的解决方案,谢谢
【解决方案3】:

我不确定我是否理解您的问题,但是,您是如何配置 sessionfactory 的?你的 sessionfactory 是 spring bean 吗?

如果是spring bean,那么默认是singleton,也就是说整个应用只存在一个sessionfactory的实例,并且是共享的。在这种情况下,您假设您正在创建一个新的 sessionfactory 然后创建一个新的数据源是错误的。

如果您是在代码中手动创建会话工厂,那么您需要自己实现单例设计模式。

private static SessionFactory seesionFactory = null;

    private static final SessionFactory makeSessionFactory()
    {
        try {
                      if (sessionFactory==null)
            seesionFactory = new Configuration().configure().buildSessionFactory();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      return seesionFactory;    
    }

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2012-10-20
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多