【问题标题】:Do I use Hibernate with Hikari correctly?我是否正确使用 Hibernate 和 Hikari?
【发布时间】:2016-02-21 17:38:52
【问题描述】:

这是我第一次使用休眠,所以我有一个小问题。 这种使用 hibernate 5.1 和 hikariCP 2.4.3 的方式正确吗?

我不确定池是否是这样工作的。

我应该打电话吗

Session session = sessionFactory.openSession();

Session session = sessionFactory.getCurrentSession();

参加会议? 当我打电话时

session.close();

连接是关闭还是归还给池。

HibernateDataStore 被线程用于访问数据库

感谢帮助

配置

<hibernate-configuration>

    <session-factory>
        <property name="hibernate.connection.provider_class">
            org.hibernate.hikaricp.internal.HikariCPConnectionProvider
        </property>
        <property name="hibernate.hikari.dataSourceClassName">
            com.mysql.jdbc.jdbc2.optional.MysqlDataSource
        </property>
        <property name="hibernate.hikari.dataSource.url">
            jdbc:mysql://localhost/xyz
        </property>
        <property name="hibernate.hikari.dataSource.user">user</property>
        <property name="hibernate.hikari.dataSource.password">xyz</property>

        <property name="hibernate.hikari.minimumIdle">20</property>
        <property name="hibernate.hikari.maximumPoolSize">100</property>

        <property name="hibernate.current_session_context_class">
            org.hibernate.context.internal.ThreadLocalSessionContext
        </property>

        <!-- SQL dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Names the annotated entity class -->
        <mapping class="XYZ"/>
    </session-factory>
</hibernate-configuration>

我的数据存储类

public class HibernateDataStore implements DataStore {
    private static final Logger logger = LogManager.getLogger();

    /** factory for hibernate sessions */
    private static SessionFactory sessionFactory;

    static {
        setUpHibernate();
    }

    /**
     * set up the hibernate session-factory
     */
    private static void setUpHibernate() {
        logger.debug("building session factory");
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure( "config/server/hibernate.cfg.xml" )
                .build();
        try {
            sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
        }
        catch (Exception e) {
            logger.error("problems building hibernate sessionFactory " + e.getMessage());

            // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory
            // so destroy it manually.
            StandardServiceRegistryBuilder.destroy( registry );
        }
        logger.debug("finished building session factory");
    }


    @Override
    public void storeProduct(Product product) {
        logger.info("storing product: " + product.getTitle());
        Instant start = Instant.now();

        final Session session = sessionFactory.openSession();
        //final Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        session.save( product );
        session.getTransaction().commit();
        session.close();

        Instant stop = Instant.now();
        logger.debug("product saved (took " + Duration.between(start, stop).toMillis() + "ms)");
    }
}

【问题讨论】:

  • 本地休眠,而不是 JPA?没有其他框架可以帮助您?
  • 我没有使用 jpa,因为我读过它有一些限制,我不想浪费时间
  • 您应该使用 Spring 或 Java EE 来帮助您完成引导部分。 JPA 是要走的路,对于“限制”部分,您也可以使用 JPA 中的 Hibernate。
  • 我没有建立一个新项目。我不能使用 spring 或 java ee。我将尝试将 dataStore 转换为 JPA

标签: java hibernate hikaricp


【解决方案1】:

我认为你应该使用 Spring 来处理会话工厂

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
    destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean>

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="connectionTestQuery" value="SELECT 1" />
    <property name="dataSourceClassName"
        value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
    <property name="dataSourceProperties">
        <props>
            <prop key="url">jdbc:mysql://localhost:3306/xyz</prop>
            <prop key="user">root</prop>
            <prop key="password"></prop>
        </props>
    </property>
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="packagesToScan" value="com.xyz.model" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.hikari.dataSource.minimumIdle">5</prop>
            <prop key="hibernate.hikari.dataSource.maximumPoolSize">20</prop>
            <prop key="hibernate.hikari.dataSource.idleTimeout">30000</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory">
</bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-10-19
    • 2016-01-24
    • 2014-05-15
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多