在我的应用程序中,我使用JPA 2.0和Hibernate作为持久性提供程序.我在两个实体之间有一对多的关系(使用@JoinColumn和不使用@JoinTable).我想知道如何在JPA注释中指定inverse=true(如指定hbm.xml)来反转关系所有者.
谢谢.
我正在分析获取线程转储的方法之间的差异.以下是我正在研究的几个人
定义一个jmx bean,它在单击声明的bean操作时通过Runtime.exec()触发jstack.
守护程序线程在预定义的时间间隔后重复执行"ManagementFactory.getThreadMXBean().dumpAllThreads(true,true)".
比较两者之间的线程转储输出,我在方法2中看到了以下缺点
我很感激获得建议/意见
在生产代码中通过Runtime.exec()执行jstack是否有任何缺点?各种操作系统上的兼容性问题 - windows,linux?
采取线程转储的任何其他方法?
谢谢.
编辑 -
1和2的组合方法似乎是要走的路.我们可以在后台运行专用线程,并以线程转储分析器可以理解的格式在日志文件中打印线程转储.如果需要任何额外的信息(比如说可能是本机线程id)只能由jstack输出记录,我们会根据需要手动执行.
我想了解使用传播支持的Spring事务的用法.java文档提到如果@Transactional(propagation = Propagation.SUPPORTS)从事务中调用的方法支持事务,但如果不存在事务,则该方法是非事务性的.
难道这不是春季交易的行为Propagation.SUPPORTS吗?
public class ServiceBean {
@Transactional(propagation = Propagation.SUPPORTS)
public void methodWithSupportsTx() {
//perform some database operations
}
}
public class OtherServiceBean {
@Transactional(propagation = Propagation.REQUIRED)
public void methodWithRequiredTx() {
//perform some database operations
serviceBean.methodWithSupportsTx();
}
}
在上面的代码示例中,无论是否methodWithSupportsTx()有@Transactional(propagation = Propagation.SUPPORTS)注释,它都会在事务中执行,具体取决于是否methodWithRequiredTx()有@Transactional注释,对吧?
那么传播级别SUPPORTS的需求/用途是什么?
我几乎没有关于连接和弹簧交易的问题.
当在事务中执行多个执行DML和DDL操作的方法时,spring是否使用相同的连接实例(传播级别为REQUIRED)?我已经读过它确实保持了相同的连接,但不知道为什么以及如何在技术上做到这一点?在解释如何提供spring源代码中的任何提示时,它会有所帮助.
如果我使用Serializable作为隔离级别,那么使用Spring声明事务会弹出以确保在该方法或从原始事务方法调用的任何其他方法中执行数据库操作时始终使用一个连接吗?
考虑到这个话题,在使用Spring Transactions时应该记住哪些要点?
任何关于这个主题的想法/帮助将不胜感激.谢谢.
更新1 - 对不起,我写了可序列化的传播级别而不是隔离级别.纠正了它.
我们处于一种将hibernate从版本3.6升级到4.1.9的模式,我面临一个错误
[#| 2013-01-14T18:33:46.519 + 0530 | INFO | glassfish3.1.1 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 122; _ThreadName =螺纹-3; | 2013-01-14 18:33:46,518 [http-thread-pool-8080(5)] ERROR envId {} - sesId {} - com.spmsoftware.webframework.exception.ExceptionHandlerUtil [31] - 未处理的异常!org.hibernate.AssertionFailure:org.hibernate.engine.jdbc.internal.StatementPreparerImpl.checkAutoGeneratedKeysSupportEnabled(StatementPreparerImpl.java:93)〜[hibernate-core-4.1.9.Final.jar:4.1.未启用getGeneratedKeys()支持. 9.Final]在org.hibernate的org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:112)~ [hibernate-core-4.1.9.Final.jar:4.1.9.Final]. id.SequenceIdentityGenerator $ Delegate.prepare(SequenceIdentityGenerator.java:106)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java :55)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final]在org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2936)〜[hibernate-core-4.1. 9.Final.jar:4.1.9.Final] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3447)~ [hibernate-core-4.1.9.Final.jar:4.1.9.Final在org.hiber 在org.hibernate.engine.spi.ActionQueue.execute(ActionQueue)中的nate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] .java:362)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)~ [hibernate-core- 4.1.9.Final.jar:4.1.9.Final] at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)~ [hibernate-core-4.1.9.Final.jar:4.1.9 .Final]在org.hibernate.event.internal的org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] .AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) 〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org.hibernate.event.internal.AbstractSaveEve ntListener.performSave(AbstractSaveEventListener.java:193)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)~ [hibernate-core-4.1.9.Final.jar:4.1.9.Final]在org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)〜[hibernate-entitymanager-4.1.9.Final. jar:4.1.9.Final]在org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] org. org.hibernate.event.internal.DefaultPersistEventListener.onPersist中的hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)~ [hibernate-core-4.1.9.Final.jar:4.1.9.Final](DefaultPersistEventListener .java:78)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final]在org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)〜[hibernate-core-4.1. 9.Final.jar:4.1.9.Final]在org.hibernate.internal的org.hibernate.internal.SessionImpl.persist(SessionImpl.java:818)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final]. SessionImpl.persist(SessionImpl.java:822)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final]在org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)〜[hibernate -entitymanager-4.1.9.Final.jar:4.1.9.Final]
当我尝试持久化具有以下定义的hibernate实体时,会出现此错误
@Entity
@Table(name = "ACCESS")
@GenericGenerator(name = "auth-generator",
strategy = "sequence-identity",
parameters = …Run Code Online (Sandbox Code Playgroud) Oracle的数据库更改通知功能在行插入,更新和删除时发送rowid(物理行地址).如oracle文档中所示,应用程序可以使用此功能构建中间层缓存.但是,当我们详细了解行ID是如何工作时,这似乎是矛盾的.
当执行各种数据库操作时,ROWID(物理行地址)可以更改,如此stackoverflow线程所示.除此之外,正如汤姆在这个线程中提到的,聚簇表可以具有相同的rowid.
基于上述研究,将数据库更改通知期间发送的rowid用作应用程序缓存中的密钥似乎不安全吗?这也引发了一个问题 - 是否应该使用数据库更改通知功能来构建应用程序服务器缓存?或者当缓存对象的表经历任何导致rowid更改的操作时,是否建议重新启动所有应用程序服务器集群(以重新加载/刷新缓存)?这对于生产环境来说是一个很好的假设吗?
我们在我们的应用程序中要求在访问/修改资源之前需要锁定资源,以避免并发操作并保持完整性。由于对资源执行了一系列操作,因此我们决定实现一个应用程序级锁定概念,所有访问资源的组件都必须遵守该概念。
请注意,资源将被多个进程访问/修改,因此同步成为开销。这也是选择应用级锁定的原因之一。
我们想到的实现应用程序级锁定的方法之一是在数据库表中插入和更新条目,该表将包含资源名称、锁类型(将是读锁、写锁或完全排他锁)和有关的信息等列。获取锁的进程。我们选择了数据库表作为一个选项,因为它是唯一一个集中于所有访问资源的进程的组件,但如果有人可以探索其他可能性,那将会很有帮助。
数据库方法的另一个问题是实现必须使用悲观锁定。(我们的应用程序使用 Oracle 作为我们的数据库服务器)。
这个问题的目的是探索实现应用程序级锁定的各种方法。
编辑 1
我提到数据库方法必须实现悲观锁定的原因是因为
乐观锁定方法本来不错,但我无法考虑如何实现它。
编辑 2 添加有关锁类型的详细信息我已更新上述问题陈述以指定有 3 种锁类型
我尝试执行 oracle alter session 查询来更改语言设置,但失败并出现错误“ORA-01036:非法变量名称/编号”。
preparedStatement = connection.prepareStatement("ALTER SESSION SET NLS_SORT = ?");
preparedStatement.setString(1, "BINARY_CI");
preparedStatement.execute();
Run Code Online (Sandbox Code Playgroud)
Oracle 不允许在 ddl 语句中绑定变量。由于绑定变量具有性能增益(在我的用例中,此更改会话查询将在 Web 应用程序中使用的每个连接上执行),并且它还可以防止应用程序遭受 SQL 注入,因此我想使用它们。如果没有绑定变量,是否还有其他优化方法来执行上述更改会话查询?
在分析其中一个生产环境的日志时,我在倒计时锁存器等待()上看到一个处于“等待”状态的线程
...sun.misc.Unsafe.park(Native Method)
...java.util.concurrent.locks.LockSupport.park(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
...java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
...java.util.concurrent.CountDownLatch.await(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
锁存器被初始化为 1,另一个线程确实在锁存器的同一实例上调用了 countDown() 方法,但主线程仍然在锁存器上被阻塞。这导致了jvm无限期挂起。
即使锁存器计数达到零也被阻止听起来不合理,我正在寻找进一步解决此问题的建议。
有任何想法吗?
注意-使用的jvm版本如下
java 版本“1.5.0_15”Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_15-b04) Java HotSpot(TM) 客户端 VM(内部版本 1.5.0_15-b04,混合模式,共享)
更新 - 下面是我上面讨论的线程的代码片段
private class MyRunnable implements Runnable, Thread.UncaughtExceptionHandler {
private AtomicBoolean shouldStop = new AtomicBoolean(false);
private CountDownLatch stopLatch = new CountDownLatch(1);
private Thread currentThread;
public void run() {
Thread.currentThread().setName("My Thread");
Thread.currentThread().setUncaughtExceptionHandler(this);
currentThread = Thread.currentThread();
if (currentThread.isInterrupted()) {
logger.debug("The pool thread had its interrupted stattus set. Clearing...");
Thread.interrupted();
logger.debug("The pool …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来记录和图形显示linux进程的CPU和RAM使用情况.因为我找不到一个简单的工具(我试过zabbix和munin但是安装失败了)我开始写一个shell脚本来这样做
脚本文件通过awk解析top命令的输出并登录到csv文件.它
以下是脚本的外观
#!/bin/sh
#A script to log the cpu and memory usage of linux processes namely - redis, logstash, elasticsearch and kibana
REDIS_PID=$(ps -ef | grep redis | grep -v grep | awk '{print $2}')
LOGSTASH_PID=$(ps -ef | grep logstash | grep -v grep | awk '{print $2}')
ELASTICSEARCH_PID=$(ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}')
KIBANA_PID=$(ps -ef | grep kibana | grep -v grep | awk '{print $2}')
LOG_FILE=/var/log/user/usage.log
echo $LOG_FILE …Run Code Online (Sandbox Code Playgroud) java ×3
hibernate ×2
oracle ×2
spring ×2
transactions ×2
awk ×1
bash ×1
generator ×1
inverse ×1
jpa ×1
linux ×1
locking ×1
propagation ×1
rowid ×1
runtime.exec ×1
sequence ×1
serializable ×1
shell ×1
thread-dump ×1