Java 维护DAO类实例池与执行新操作符

Java 维护DAO类实例池与执行新操作符,java,reflection,Java,Reflection,一段时间以来,我们一直在尝试以多种方式对应用程序性能进行基准测试。 我一直认为使用Class.newInstance()在java中创建对象并不慢(至少在java的1.4版本之后)。但无论如何,我们做了一个测试,在1000个对象的对象池中使用newInstance方法vs MainIta。我们使用JDBC从DB加载数据并填充这些对象,进行了大约200000次迭代。 看到newInstance代码比对象池代码慢近10倍,我感到惊讶(甚至震惊) 这些对象表示具有大约50个字段和所有字符串类型的表 有

一段时间以来,我们一直在尝试以多种方式对应用程序性能进行基准测试。 我一直认为使用Class.newInstance()在java中创建对象并不慢(至少在java的1.4版本之后)。但无论如何,我们做了一个测试,在1000个对象的对象池中使用newInstance方法vs MainIta。我们使用JDBC从DB加载数据并填充这些对象,进行了大约200000次迭代。 看到newInstance代码比对象池代码慢近10倍,我感到惊讶(甚至震惊)

这些对象表示具有大约50个字段和所有字符串类型的表

有人能分享一下关于这个问题的想法吗?现在我更困惑的是,如果对象池至少包含一些DAO实例是一个更好的选择的话。我现在看到的池大小应该足够大,可以满足平均请求的大小。 我的内存占用将增加,这有一个反面,但我开始怀疑这种想法是否至少对一些代表大约50列或更多列的表的DAO实体有意义

请分享您的想法,并让我知道是否有人尝试过这一点,或者我是否遗漏了以下几点:

对对象池说不就行了

无论你遇到什么问题,都可能有一个更简单的选择。例如,首先为什么要实例化这么多DAO实例?是否每次需要从数据库检索数据时都会创建一个新的DAO实例


为什么不在每次需要访问
WhateverDao
数据时重复使用同一个
WhateverDao
实例?只要确保DAO是线程安全的。

一个DAO对象池是个坏主意。一个数据库连接池,是一个好主意。我的问题是,你到底有什么?如果您在每个DAO中打开一个连接,而不共享连接,那么您会看到更好的性能,因为您共享了连接,而不是共享了DAO对象。
我的下一个问题是,你在构造器中做什么花了这么长时间?如果您的构造函数执行起来很昂贵,那么对象池可能是一个好主意。尽管如此,我还是会考虑从构造函数中获取您正在执行的任何操作…

我不确定是否理解您的解决方案。是的,每次我访问数据库时,都会有一个基于类名的通用代码创建一个新实例。如果您建议重用已经创建的实例,那么这正是我想要对对象池所做的。请让我知道我遗漏了什么?我是说创建一个池是一个坏主意。使用DAO的类应该有一个成员变量,该变量引用它需要的DAO;它不需要每次需要执行操作时都请求一个新的DAO引用。我们有一个数据库连接池。打开连接的代码不是每个DAO,而是所有DAO对象的一个超类。在查询执行时获得结果集后,此代码使用CLass.newInstance()方法实例化右侧子类的对象,然后在子类中调用一个方法,该方法读取结果集并填充表示表中所有字段的对象的所有DataMember