我们有一个OSGi容器,里面有很多产品,其中一个是我们的产品.
我们正在运行一些性能测试,并且存在一个奇怪的问题,即每个OSGi容器重启都会导致我们的一些测试的性能偏差高达400%.
通过一些测试和事情,我能够跟踪这个方法:
public static Method getMethodForSlotKey(Class<?> cls, String slotKey, String methodType) {
Method[] methods = cls.getMethods();
if (methods != null && methods.length > 0) {
for (Method method : methods) {
String methName = method.getName();
if (methName.startsWith(methodType)) {
IDataAnnotation annot = method.getAnnotation(IDataAnnotation.class);
if (annot != null) {
String annotSlotKey = annot.SlotKey();
if (annotSlotKey != null && annotSlotKey.equals(slotKey)) {
Class<?>[] paramTypes = method.getParameterTypes();
// for now, check length == 1 for setter and 0 for getter.
int len = SET_TXT.equals(methodType) …Run Code Online (Sandbox Code Playgroud) 我们正在使用 Jess,它是一个用 Java 编写的规则引擎。它已经变得相当古老,并且大部分是使用 Java 1.5 和更低版本的语言功能编写的。现在,我们已经使用它很多年了,在 Java 升级过程中从未注意到任何问题,直到现在,当我们计划从 Java 11 切换到 Java 17 时。
仅通过切换 java 版本,我们的运行时间就变慢了 30-40%。我们已经做了很多测试,但无法真正找到罪魁祸首。
例如,我们检查了不同的 Java 版本和不同的供应商(eclipse、azul 和 orcacle),13+ 的所有版本都比 Java 11 慢。
使用 VisualVM,我能够指出一些方法,但没有任何具体的内容可以说明这可能是问题所在。
看看它,似乎有多个性能回归加在一起就是一个很大的回归,但这似乎很不现实。
一些函数如下所示:
private synchronized Map findVariable(String key) {
Context c = this;
while (c != null) {
Map ht = c.getVariables();
Value v = (Value) ht.get(key);
if (v != null)
return ht;
else
c = c.m_parent;
}
return null;
}
private synchronized Map getVariables() {
if (m_variables == null)
m_variables …Run Code Online (Sandbox Code Playgroud) 我拼命地尝试从表单提交中接收值列表并将其绑定到对象列表.
什么有效是检索单行:
//class
case class Task(name: String, description: String)
val taskForm: Form[Task] = Form(
mapping(
"name" -> text,
"description" -> text
)(Task.apply)(Task.unapply)
)
//form
<tr>
<td><input name="name" type="text" class="span2" placeholder="Name..."></td>
<td><textarea name="description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea>
</td>
</tr>
//receiving action:
val task = taskForm.bindFromRequest.get
Run Code Online (Sandbox Code Playgroud)
但是现在我想提交多个类型为task的对象,例如:
<tr>
<td><input name="name[0]" type="text" class="span2" placeholder="Name..."></td>
<td><textarea name="description[0]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>
</tr>
<tr>
<td><input name="name[1]" type="text" class="span2" placeholder="Name..."></td>
<td><textarea name="description[1]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
现在执行taskForm.bindFromRequest.get失败.
有人想出一个解决方案吗?或者你处理这种情况完全不同?
我有一个 postgresql 数据库,在迁移到新版本并导入旧数据后,我的主键出现了问题:
\n\norg.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint \n"browser_link_pkey" Detail: Key (id)=(173) already exists.\nRun Code Online (Sandbox Code Playgroud)\n\n所以我想重置我的序列,但运行:
\n\nselect nextval(\'browser_link_id_seq\')\nRun Code Online (Sandbox Code Playgroud)\n\n也失败:
\n\ncolumn \xe2\x80\x9ebrowser_link_id_seq\xe2\x80\x9c does not exist\nSQL Status:42703\nRun Code Online (Sandbox Code Playgroud)\n\n这是建表的SQL
\n\nCREATE TABLE browser_link (\n id bigint NOT NULL,\n....\n);\nALTER TABLE ONLY browser_link\nADD CONSTRAINT browser_link_pkey PRIMARY KEY (id);\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试选择串行序列,但似乎不存在:
\n\npostgres=# \\connect historify\nYou are now connected to database "historify" as user "postgres".\nhistorify=# select pg_get_serial_sequence(\'browser_link\', \'id\');\n pg_get_serial_sequence\n------------------------\n\n(1 row)\nRun Code Online (Sandbox Code Playgroud)\n\n我正在使用 postgresql 9.5.3。另外,在发生错误之前,id 列确实按预期增加,因此它确实可以工作。
\n\n现在我的两个问题:
\n\njava ×2
performance ×2
binding ×1
forms ×1
java-11 ×1
java-13 ×1
osgi ×1
postgresql ×1
primary-key ×1
reflection ×1
regression ×1
scala ×1
sequence ×1