我是Spring/JPA/Hibernate的新手,虽然听起来很简单,但事实并非如此.我可以使用一些帮助.
我有一个父实体,其中包含子实体列表.我会用这些来简化讨论:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="parent")
private List<Child> children= new ArrayList<Child>();
etc...
}
@Entity
public class Child {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Parent parent;
etc...
}
@Repository
public interface ParentRepository extends JpaRepository<Parent, Long> {};
Run Code Online (Sandbox Code Playgroud)
第1轮,我创建一个新的父级和一个新的子级,将子级添加到父级列表并在子级上设置父级.当我保存父母时,孩子也被保存.
@Transactional(propagation=Propagation.REQUIRES_NEW)
void create() {
Parent parent = new Parent();
Child child = new Child();
parent.add(child);
child.setParent(parent);
parent = repository.save(parent);
}
Run Code Online (Sandbox Code Playgroud)
现在,第2轮,我添加了一个新的孩子:
@Transactional(propagation=Propagation.REQUIRES_NEW)
void update() {
Parent parent = repository.findOne(parentID);
Child newChild …Run Code Online (Sandbox Code Playgroud) 首先,这个问题涉及Oracle SQL Developer 3.2,而不是SQL*Plus或iSQL等.我已经做了很多搜索,但还没有找到一个直接的答案.
我有几个脚本集合,我正在尝试自动化(顺便说一句,我的SQL经验非常基本,主要是基于MS的).我遇到的麻烦是通过相对路径执行它们.例如,假设此设置:
scripts/A/runAll.sql
| /A1.sql
| /A2.sql
|
/B/runAll.sql
/B1.sql
/B2.sql
Run Code Online (Sandbox Code Playgroud)
我想要一个这样的文件scripts/runEverything.sql:
@@/A/runAll.sql
@@/B/runAll.sql
Run Code Online (Sandbox Code Playgroud)
脚本/ A/runAll.sql:
@@/A1.sql
@@/A2.sql
Run Code Online (Sandbox Code Playgroud)
在那里"@@",我推测,是指在SQL*Plus相对路径.
我愚弄了制作变量,但没有太多运气.我已经能够'&1'在根目录中使用和传递类似的东西.即:scripts/runEverything.sql:
@'&1/A/runAll.sql' '&1/A'
@'&1/B/runAll.sql' '&1/B'
Run Code Online (Sandbox Code Playgroud)
并通过执行以下命令调用它:
@'c:/.../scripts/runEverything.sql' 'c:/.../scripts'
Run Code Online (Sandbox Code Playgroud)
但这里的问题是B/runAll.sql用路径调用:c:/.../scripts/A/B.
那么,SQL Developer是否可以进行嵌套调用,以及如何进行?
在用户登录时更新 HTTP 会话是一种常见的最佳实践。这将强制使用新的会话 ID,避免会话固定漏洞。
当涉及@SessionScoped bean 时,是否有使用 CDI 实现此功能的首选模式?困难在于,通过使当前的 HTTP 会话无效,您将在下一个请求中获得一个不同的会话范围的 bean,但直到下一个请求才会如此。
例如,假设一个会话 bean 用于存储用户登录信息:
@Named("sessionbean")
@SessionScoped
public class SessionBean implements Serializable {
private int userId;
private String username;
private List<String> privileges;
// Accessors omitted
}
Run Code Online (Sandbox Code Playgroud)
另一个用于管理登录的 bean:
@Named("loginbean")
@ViewScoped
public class LoginBean implements Serializable {
private String username;
private String password;
@Inject private SessionBean session;
@Inject private SessionManager sessionManager;
@Inject private PrivilegeManager privilegeManager;
public String doLogin() {
String destinationUrl;
if (validate(username, password)) {
FacesContext context = FacesContext.getCurrentInstance();
// force …Run Code Online (Sandbox Code Playgroud) 我已经阅读了大量帖子,但显然我在理解中遗漏了一些东西。我有一个 Tomcat 服务,它安装了:
--JvmMx=1000
--JvmMs=128
Run Code Online (Sandbox Code Playgroud)
我已经通过以下调用验证了这些设置是否成功:
PsExec.exe -s {jdk}\bin\jinfo.exe -flag MaxHeapSize {pid}
Run Code Online (Sandbox Code Playgroud)
但是,此服务的 tomcat7.exe 进程持续增长,超过此最大值的 3 倍或更多倍,直到它使服务器爬行。奇怪的是,这只是一台服务器上的问题;在其他任何地方,它都相当稳定,并保持在限制之下。我还在我的开发环境中寻找内存泄漏,但没有找到。
为了调试这个,我试过像这样强制 GC:
PsExec.exe -s {jdk}\bin\jcmd.exe {pid} GC.run
Run Code Online (Sandbox Code Playgroud)
但这似乎没有效果。所以接下来我通过将它添加到安装中来设置 jconsole 监控:
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.port=8086"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.ssl=false"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.authenticate=false"
Run Code Online (Sandbox Code Playgroud)
现在(当然!)它很乖。GC 显然工作正常,进程内存保持在限制以下。
我很困惑。最大堆是 1 GB,永久内存是 90 MB,堆栈大小是默认的,所以大约 128 KB?而没有增长的线程数“只有”67。那么进程内存如何上升到3+GB呢?为什么它不抛出内存不足异常?
即使是现在,根据 jconsole 的“行为良好”服务仅使用大约 50 MB 的堆,在 57 个线程上运行。然而,任务管理器显示 71 个线程使用 800 MB。我认为差异是由于 Tomcat 造成的,是吗?请帮助我填补我的理解空白。