Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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中的会话转换为JDBC连接中的会话_Java_Hibernate_Session_Jdbc - Fatal编程技术网

Java 将hibernate中的会话转换为JDBC连接中的会话

Java 将hibernate中的会话转换为JDBC连接中的会话,java,hibernate,session,jdbc,Java,Hibernate,Session,Jdbc,为了克服使用hibernate时产生的开销,我将从hibernate转换回普通JDBC。我想知道如何处理与hibernate相关的会话。我应该如何转换回普通JDBC,以便用JDBC连接替换我的所有会话。如果我的想法有误,请告诉我用连接替换会话会转换回普通的JDBC,因为我对这些概念不太熟悉,也不知道我的方法是否正确。我在高性能任务中广泛使用Hibernate,包括批量插入数百万条记录。您的问题不在于Hibernate,而在于您使用它的方式 最重要的是,不要将Hibernate用作持久状态管理器;

为了克服使用hibernate时产生的开销,我将从hibernate转换回普通JDBC。我想知道如何处理与hibernate相关的会话。我应该如何转换回普通JDBC,以便用JDBC连接替换我的所有会话。如果我的想法有误,请告诉我用连接替换会话会转换回普通的JDBC,因为我对这些概念不太熟悉,也不知道我的方法是否正确。

我在高性能任务中广泛使用Hibernate,包括批量插入数百万条记录。您的问题不在于Hibernate,而在于您使用它的方式

最重要的是,不要将Hibernate用作持久状态管理器;将其用作原始SQL之上的薄层,您就不会抱怨性能了

  • 始终首选
    无状态会话
    (它适用于除
    保存
    操作之外的所有需要的操作)`
  • 永远不要使用延迟抓取,对所有事情都使用显式连接
  • 永远不要获取整个对象,使用SELECT精确获取所需的对象
  • 在一条语句中尽可能多地提取,不惜一切代价避免n+1选择
  • 对于大型结果集,切勿使用
    列表
    、使用
    迭代
    滚动
  • 这个名单还在继续,但这就是我现在想到的

    至于你的直接问题,这取决于应用程序。如果它是一个Spring应用程序,那么您肯定希望使用它的声明性事务管理。基本上,您只需放置几行XML配置,就可以在DAO代码中使用一个开放的数据源,而无需进行管理

    如果您正在做一些更原始的事情,那么一定要使用连接池库,比如great BoneCP。您从它获取连接,然后将它们返回给它,同样没有明确的管理


    最后,如果您真的想要一种简单、不安全和不可伸缩的方法,那么您可以直接从JDBC驱动程序创建连接。这种方法实际上只适用于学校作业,即使在最小的有生产价值的项目中也不推荐使用。

    我在高性能任务中广泛使用了Hibernate,包括批量插入数百万条记录。您的问题不在于Hibernate,而在于您使用它的方式

    最重要的是,不要将Hibernate用作持久状态管理器;将其用作原始SQL之上的薄层,您就不会抱怨性能了

  • 始终首选
    无状态会话
    (它适用于除
    保存
    操作之外的所有需要的操作)`
  • 永远不要使用延迟抓取,对所有事情都使用显式连接
  • 永远不要获取整个对象,使用SELECT精确获取所需的对象
  • 在一条语句中尽可能多地提取,不惜一切代价避免n+1选择
  • 对于大型结果集,切勿使用
    列表
    、使用
    迭代
    滚动
  • 这个名单还在继续,但这就是我现在想到的

    至于你的直接问题,这取决于应用程序。如果它是一个Spring应用程序,那么您肯定希望使用它的声明性事务管理。基本上,您只需放置几行XML配置,就可以在DAO代码中使用一个开放的数据源,而无需进行管理

    如果您正在做一些更原始的事情,那么一定要使用连接池库,比如great BoneCP。您从它获取连接,然后将它们返回给它,同样没有明确的管理


    最后,如果您真的想要一种简单、不安全和不可伸缩的方法,那么您可以直接从JDBC驱动程序创建连接。这种方法实际上只适用于学校作业,即使在最小的有生产价值的项目中也不推荐使用。

    Hibernate会话远不止是JDBC连接。它包含多个这样的连接(通常通过回收JDBC连接实例的JDBC连接池进行管理)、一组连接到所述会话并由其管理的实体以及其他东西(缓存等)

    删除Hibernate并只使用JDBCAPI执行所有操作,这意味着不仅仅是用一个或多个JDBC连接替换Hibernate会话实例,然后将Hibernate代码复制到类似的JDBCAPI调用中。如果您只这样做,您只需要做大量的工作,而不必付出任何代价,因为您将失去Hibernate的所有优势(更少的详细代码、更高级别的抽象,等等),而没有获得JDBC的优势(使用的堆内存更少,方法调用更少(是的,即使使用Hibernate的Javassist魔法,在某些情况下,这仍然会影响性能)更细粒度地控制数据库交互等)

    我的建议是,首先认真研究一下你的应用程序存在的问题(显然是由于Hibernate造成的),至少对于主要的问题,试着首先看看如果不摆脱Hibernate,你是否无法对其进行优化。是的,Hibernate可能会变得沉重和内存不足,但性能问题往往来自对框架的不当使用(您确定要在一个查询中获取所有必要的关联实体,还是让Hibernate在后台进行隐藏联接或伪联接?您是在数据库端进行数据操作,还是在执行了一个更通用的Hibernate查询以获取数据后,在Java代码中完成了其中一些操作?等等。)

    如果您真的需要摆脱Hibernate(可能您需要使用数据库的一些非常特定的功能,这些功能不是标准SQL,Hibernate不允许您访问,例如MySQL通过自定义平面文件格式导入大量数据),那么请确保您正在用它替换它(简单的JDBC,或者其他一些