Java Hibernate有什么用?太慢了?开发人员缺少什么?

Java Hibernate有什么用?太慢了?开发人员缺少什么?,java,spring,hibernate,oracle12c,Java,Spring,Hibernate,Oracle12c,我正在从事一个需要与数据库交互的web应用程序项目(本例中为Oracle 12c): 为了更好地理解和测试Hibernate的功能(因为我是第一次使用Hibernate):我编写了一个调用web服务的小型web应用程序。该web服务的后端反过来使用hibernate从Oracle数据库获取数据(它执行一个只读查询(通过CreateSQLQuery的存储过程)) 它给出了以下结果(其中web服务在本地(tomcat 8)上运行,数据库在远程(aws)上运行): 520条记录提取时间:21020毫秒

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

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

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

520条记录提取时间:21020毫秒(提取时间约为21秒)

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

我有几个问题:

1.我想知道Hibernate有什么用

2.我的第一个练习太慢了,我在网上搜索了很多遍,但没有找到任何直接的答案或方向

3.如果您是使用hibernate的人,请告诉我您为什么要使用此hibernate,以及它解决了什么业务问题(例如,它是否适合只运行基本web应用程序的初学者?)

4.您能告诉我Hibernate开发人员缺少什么吗

参考资料:

下面是我简单的Hibernate工作的背景:

查询:

List<Model> modelList = session.createSQLQuery("SELECT * FROM TABLE)
                .addEntity(modelList.class).list();
<?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>

}

对于您的.project来说,OR/M是一种过分的手段。它们最适合用于事务性数据(加载、修改、存储)。另外,一个主要的好处是不需要编写SQL,但无论如何您都在这样做

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

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

1.我想知道Hibernate的用途是什么

如果你不知道,那么你就不应该开始使用它。Hibernate是一个ORM:对象关系映射器。它允许以对象(称为实体)的互连图的形式“查看”数据库各种表中的行。Hibernate处理将行转换为对象、延迟加载关联、跟踪每个对象的状态并使其透明持久化等问题

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

  • 在我的第一个练习中,它太慢了,我在互联网上搜索了很多遍,但没有找到任何直接的答案或方向 您的用例不是使用Hibernate的最佳用例。您应该使用普通JDBC:

    • 它使用单个表,因此对关联和延迟加载的支持是无用的
    • 当您有这样一个简单的用例时,额外的复杂性是不值得的
    • 在处理大量实体时,Hibernate确实比较慢,除非您遵循。这不是它的目的
    3.如果你是使用hibernate的人,那么请告诉我你为什么使用hibernate,以及它解决了什么业务问题(例如,它是为只会运行基本web应用程序的初学者提供的?)

    见1

    4.您能告诉我Hibernate开发人员缺少什么吗


    参见1。

    我使用过JDBC,并且所用的时间与Hibernate ORM差不多——520条记录获取时间:21020毫秒(大约21秒),3846条记录获取时间:172383毫秒(172秒~3分钟)(在JDBC中,第一条记录仅增加1-2秒,第二条记录增加20秒)。您所说的本机Oracle客户端是什么意思?
    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();
    }