Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate spring不关闭连接_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java hibernate spring不关闭连接

Java hibernate spring不关闭连接,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我尝试使用spring和hibernate来填充数据库(MySQL)。但是在插入25-30k之后,我得到了以下错误: févr. 15, 2017 12:14:27 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 0, SQLState: 08001 févr. 15, 2017 12:14:27 PM org.hibernate.engine.jdbc.spi.SqlExcep

我尝试使用spring和hibernate来填充数据库(MySQL)。但是在插入25-30k之后,我得到了以下错误:

févr. 15, 2017 12:14:27 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 08001
févr. 15, 2017 12:14:27 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy28.create(Unknown Source)
    at main.Main.recupReq(Main.java:353)
    at main.Main.manageCategories(Main.java:140)
    at main.Main.transformOldModelToNewModel(Main.java:119)
    at main.Main.transferXMLtoDB(Main.java:82)
    at main.Main.main(Main.java:59)
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:102)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:247)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:254)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:203)
    at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:56)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:189)
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
    ... 12 more
Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:526)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:505)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:479)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:489)
    at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1677)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1601)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:633)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:347)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:196)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:159)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99)
    ... 19 more
Caused by: com.mysql.cj.core.exceptions.CJCommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149)
    at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:83)
    at com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:122)
    at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1619)
    ... 32 more
Caused by: java.net.BindException: Address already in use: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.mysql.cj.core.io.StandardSocketFactory.connect(StandardSocketFactory.java:202)
    at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:57)
    ... 34 more
févr. 15, 2017 12:14:27 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose
INFOS: Closing org.springframework.context.support.ClassPathXmlApplicationContext@41906a77: startup date [Wed Feb 15 12:12:59 CET 2017]; root of context hierarchy
févr. 15, 2017 12:14:27 PM org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean destroy
INFOS: Closing JPA EntityManagerFactory for persistence unit 'default'
编辑:我试图打开和关闭ClassPathXmlApplicationContext以续订连接,但发生了相同的错误:java.net.BindException:地址已在使用:connect

编辑2: 道:

而且多次打开和关闭只是一个测试。我通常在开始时打开,在结束时关闭

编辑3:

以下是我插入的代码的一部分:

private List<NewModelProject> transformOldModelToNewModel(List<ProjectType> projectsFromXML) {
        List<NewModelProject> projectsNewModel = new ArrayList<>();

        for (ProjectType projectType : projectsFromXML) {
            System.out.println("proj:" + projectType.getName());
            NewModelProject project = new NewModelProject();
            project.setBaseline(projectType.getBaseline());
            project.setDescription(projectType.getDescription());
            project.setId(Integer.parseInt(projectType.getId()));
            project.setName(projectType.getName());
            projectsNewModel.add(project);
            dao.getDaoProject().create(project);
            objectToUpdate.add(project);

            manageCategories(projectType, project);

            manageScenarios(projectType, project);
        }

        gestionTraceability();

        return projectsNewModel;
    }
private List transformoldmodel到ewmodel(List projectsFromXML){
List projectsNewModel=new ArrayList();
for(ProjectType ProjectType:projectsFromXML){
System.out.println(“proj:+projectType.getName());
NewModelProject=newnewmodelproject();
setBaseline(projectType.getBaseline());
project.setDescription(projectType.getDescription());
setId(Integer.parseInt(projectType.getId());
project.setName(projectType.getName());
projectsNewModel.add(项目);
dao.getDaoProject().create(项目);
objectToUpdate.add(项目);
管理类别(项目类型、项目);
管理场景(项目类型、项目);
}
手势跟踪();
返回项目模型;
}

多亏了M.Deinum找到了解决方案

我需要在applicationContext中将DriverManager数据源替换为BasicDataSource:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- Activation annotations et scan des classes -->
    <context:annotation-config />
    <context:component-scan base-package="jpa" />



    <!-- Specify the Hibernate properties setting file -->
    <context:property-placeholder
        location="classpath:hibernate.properties" />

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- Creation EntityManagerFactory à partir de la dataSource -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="jpa" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
                <property name="showSql" value="${hibernate.show_sql}" />
                <property name="generateDdl" value="true" />
            </bean>
        </property>
<!--        <property name="jpaProperties"> -->
<!--    <props> -->
<!--        <prop key="hibernate.hbm2ddl.auto">${hibernate.action}"</prop> -->
<!--    </props> -->
<!-- </property> -->
    </bean>


    <!-- getionnaire transaction entityManagerFactory -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- activation de l'annotation @Transcationnal -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- activation translation d'execption -->
    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"></bean>

</beans

DriverManager数据源为每个请求创建一个新的连接,当我们要发送大量请求时,这是有问题的。

您可以在实际插入的位置共享代码吗?添加您实际使用的代码。。。您使用的是
drivermanagedatasource
这一事实也让我感到害怕,因为您提到了打开/关闭应用程序上下文(这通常是您永远不应该做的事情)。这有点复杂,因为从数据库XML传输到mySQL需要一些代码(使用后转储),而且会有点长。我将把dao和从spring开始的singleton放进去。为什么使用DriverManager数据源会让你感到害怕?我应该使用什么?你应该使用正确的连接池。。。另外,我真的希望
新的ClassPathXmlApplicationContext
in方法不是您在整个应用程序中使用的模式。。。除非您的目标是耗尽内存,否则会出现奇怪的数据库锁定,当然还有事务管理问题。您不应该创建新的应用程序上下文(除非您使用
main
方法启动应用程序,否则您只能在其中创建一个新实例,而不能在其他地方创建)。
package jpa.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import jpa.model.NewModelAttr;

@Repository
@Transactional
public class DaoAttrJpa implements DaoAttr{

    @PersistenceContext
    private EntityManager em;

    @Override
    public void create(NewModelAttr obj) {
        em.persist(obj);

    }

    @Override
    public void delete(NewModelAttr obj) {
        em.remove(em.merge(obj));

    }

    @Override
    public NewModelAttr update(NewModelAttr obj) {
        return em.merge(obj);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<NewModelAttr> findAll() {
        List<NewModelAttr> liste = null;   
        Query query = em.createNamedQuery("NewModelAttr.findAll", NewModelAttr.class);
        liste = query.getResultList();
        return liste;
    }

    @Override
    public NewModelAttr findByPrimaryKey(Integer key) {
        return em.find(NewModelAttr.class, key);
    }

}
package jpa.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;

import jpa.dao.*;

@Repository
public class AccessDao {
    private static ClassPathXmlApplicationContext context;
    private static AccessDao instance = null;
    @Autowired
    private DaoProject daoProject;
    @Autowired
    private DaoLink daoLink;
    @Autowired
    private DaoPath daoPath;
    @Autowired
    private DaoRequirement daoRequirement;
    @Autowired
    private DaoScenario daoScenario;
    @Autowired
    private DaoStep daoStep;
    @Autowired
    private DaoAttr daoAttr;
    @Autowired
    private DaoCategory daoCategory;

//  private AccessDao() {
//      context = new ClassPathXmlApplicationContext("applicationContext.xml");
//      daoProject = (DaoProject) context.getBean("daoProjectJpa");
//      daoLink = (DaoLink) context.getBean("daoLinkJpa");
//      daoPath = (DaoPath) context.getBean("daoPathJpa");
//      daoRequirement = (DaoRequirement) context.getBean("daoRequirementJpa");
//      daoScenario = (DaoScenario) context.getBean("daoScenarioJpa");
//      daoStep = (DaoStep) context.getBean("daoStepJpa");
//      daoAttr = (DaoAttr) context.getBean("daoAttrJpa");
//      daoCategory = (DaoCategory) context.getBean("daoCategoryJpa");
//  }

    public static AccessDao getInstance() {
        if (AccessDao.instance == null) {
            context = new ClassPathXmlApplicationContext("applicationContext.xml");
            AccessDao.instance = (AccessDao) context.getBean("accessDao");

        }

        return AccessDao.instance;
    }

    public DaoProject getDaoProject() {
        return daoProject;
    }

    public void setDaoProject(DaoProject daoProject) {
        this.daoProject = daoProject;
    }

    public DaoLink getDaoLink() {
        return daoLink;
    }

    public void setDaoLink(DaoLink daoLink) {
        this.daoLink = daoLink;
    }

    public DaoPath getDaoPath() {
        return daoPath;
    }

    public void setDaoPath(DaoPath daoPath) {
        this.daoPath = daoPath;
    }

    public DaoRequirement getDaoRequirement() {
        return daoRequirement;
    }

    public void setDaoRequirement(DaoRequirement daoRequirement) {
        this.daoRequirement = daoRequirement;
    }

    public DaoScenario getDaoScenario() {
        return daoScenario;
    }

    public void setDaoScenario(DaoScenario daoScenario) {
        this.daoScenario = daoScenario;
    }

    public DaoStep getDaoStep() {
        return daoStep;
    }

    public void setDaoStep(DaoStep daoStep) {
        this.daoStep = daoStep;
    }

    public DaoAttr getDaoAttr() {
        return daoAttr;
    }

    public void setDaoAttr(DaoAttr daoAttr) {
        this.daoAttr = daoAttr;
    }

    public DaoCategory getDaoCategory() {
        return daoCategory;
    }

    public void setDaoCategory(DaoCategory daoCategory) {
        this.daoCategory = daoCategory;
    }

    public static void close() {
        if (instance != null) {
            instance.destroy();
        }
    }

    private void destroy() {
        context.close();
        instance=null;
    }
}
private List<NewModelProject> transformOldModelToNewModel(List<ProjectType> projectsFromXML) {
        List<NewModelProject> projectsNewModel = new ArrayList<>();

        for (ProjectType projectType : projectsFromXML) {
            System.out.println("proj:" + projectType.getName());
            NewModelProject project = new NewModelProject();
            project.setBaseline(projectType.getBaseline());
            project.setDescription(projectType.getDescription());
            project.setId(Integer.parseInt(projectType.getId()));
            project.setName(projectType.getName());
            projectsNewModel.add(project);
            dao.getDaoProject().create(project);
            objectToUpdate.add(project);

            manageCategories(projectType, project);

            manageScenarios(projectType, project);
        }

        gestionTraceability();

        return projectsNewModel;
    }