Hibernate有什么用?它太慢了?什么是开发人员的遗失?

时间:2015-12-11 16:08:46

标签: java spring hibernate oracle12c

我正在开发一个需要与数据库交互的Web应用程序项目(在本例中为Oracle 12c):

很好地理解和测试Hibernate的功能(因为我是Hibernate的第一次用户):我写了一个调用Web服务的小型Web应用程序。该Web服务的后端依次使用hibernate从Oracle数据库中获取数据(它执行只读查询(通过CreateSQLQuery实现存储过程))。

它给出了以下结果,(我的本地(tomcat 8)上运行的Web服务和远程(aws)中的数据库):

520取得的记录:21020毫秒(约21秒取指)

3846获取记录:172383毫秒(172秒~3分钟)

我有几个问题:

1. 我想知道Hibernate有什么用?

2。我的第一次练习太慢了,我在网上搜索但是没有找到任何直接的答案或指示?

3。如果您是使用hibernate的人,那么请您告诉我您使用此hibernate的原因,以及它解决的业务问题(例如,它是否适用于初学者运行基本的Web应用程序?)

4. 请您告诉我Hibernate的开发人员缺少什么?

参考文献: simple-hibernate-query-returning-very-slowly

why-is-the-hibernate-query-list-slow

hibernate-performance

hibernate-query-running-slow

sql-query-within-hibernate-extremely-slow-while-very-fast-using-sql-cient

以下是我简单的Hibernate工作的上下文:

查询:

List<Model> modelList = session.createSQLQuery("SELECT * FROM TABLE)
                .addEntity(modelList.class).list();

* TABLE - 为了简单起见,我更改了名称,我只运行一个简单的选择查询来获取它,没有任何复杂的,

配置文件

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@X.X.X.X:1521:orcl</property>
        <property name="hibernate.connection.password">*****</property>
        <property name="hibernate.connection.username">******</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto"></property>
        <mapping class="x.x.x.x.xsModel" />
        <mapping class="x.x.x.x.dModel" />


    </session-factory> </hibernate-configuration>

HiberNate Util

公共类HibernateUtil {     // private static final SessionFactory sessionFactory = buildSessionFactory();     private static SessionFactory sessionFactory = buildSessionFactory();

private static final Logger logger = LoggerFactory.getLogger(HibernateUtil.class);

private static SessionFactory buildSessionFactory()
{
    try
    {
        if (sessionFactory == null) {
            // loads configuration and mappings
            Configuration configuration = new Configuration().configure()
                    .setProperty("hibernate.connection.driver_class", "oracle.jdbc.OracleDriver")
                    .setProperty("hibernate.connection.url", "jdbc:oracle:thin:@X.X.X.X:orcl")
                    .setProperty("hibernate.connection.password","aaaaa")
                    .setProperty("hibernate.connection.username","aaaaa")
                    .setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect")
                    .setProperty("show_sql","true")
                    //.setProperty("hibernate.hbm2ddl.auto", "")
                   // .setProperty("hibernate.temp.use_jdbc_metadata_defaults","false")
                   // .setProperty("hibernate.jdbc.lob.non_contextual_creation","true")
            .addAnnotatedClass(dModel.class)
                    .addAnnotatedClass(sModel.class);

            ServiceRegistry serviceRegistry
                    = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();


            // builds a session factory from the service registry
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        }
        return sessionFactory;
    }
    catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        logger.error("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {

    return sessionFactory;
}

public static void shutdown() {
    // Close caches and connection pools
    getSessionFactory().close();
}

}

2 个答案:

答案 0 :(得分:3)

  

1.我想知道Hibernate有什么用?

如果您不知道,那么您就不应该开始使用它。 Hibernate是一个ORM:Object-Relational Mapper。它允许&#34;观看&#34;来自数据库的各个表的行作为对象的互连图(称为实体)。 Hibernate处理将行转换为对象,延迟加载关联,跟踪每个对象的状态并使其持久透明等等。

主要的好处是能够编写以更自然,面向对象的方式获取和写入数据到数据库的代码,让Hibernate完成查询数据库的繁琐工作。

  
      
  1. 在我的第一次练习中它太慢了,我在网上搜索但没有找到任何直接的答案或指示?
  2.   

您的用例不是使用Hibernate的最佳用例。你应该使用普通的JDBC:

  • 它使用单个表,因此对关联和延迟加载的支持是无用的
  • 当你有这么简单的用例时,额外的复杂性是不值得的
  • 在处理大量实体时,除非你遵循the instructions in the manual,否则Hibernate确实会变慢。这不是它的目的。
  

3.如果您是使用hibernate的人,那么请您告诉我您使用此hibernate的原因,以及它解决了哪些业务问题(例如,它是否适用于可以运行基本Web应用程序的初学者?)< / p>

见1.

  

4.请您告诉我Hibernate的开发人员缺少什么?

见1.

答案 1 :(得分:1)

OR.M对你的项目来说太过分了。它们最适用于事务数据(加载,修改,存储)。此外,其中一个主要好处是不需要编写SQL,但无论如何你都是这样做的。

您遇到性能不佳的主要原因是每条记录的所有数据都存储在会话缓存中。

我建议使用本机Oracle客户端并直接写入对象。