所以,我在我的 gradle 版本中使用了一个插件(该插件是 org.flywaydb.flyway 但这并不是真正相关的)。我想验证调用者是否在此插件中的任务正在执行时传入了运行时参数,但在其他任务执行时不传入。
我根据提供的参数将选项传递给 flyway 插件。我希望在执行 flywayTask 并且未提供参数时返回错误。当非飞行任务正在运行时,我不想验证是否提供了参数。
gradle -PmyParam=myValue flywayMigration
Run Code Online (Sandbox Code Playgroud)
=> 应该运行代码并且应该没有错误
gradle flywayMigration
Run Code Online (Sandbox Code Playgroud)
=> 应该运行代码并且应该产生错误(因为没有提供参数)
gradle jar
Run Code Online (Sandbox Code Playgroud)
=> 不应该运行代码并且不应该产生错误
我一直在阅读有关 gradle 配置和执行的文章,这很好,但我仍然找不到一种方法,仅在执行 flyway 插件或执行特定的 flyway 任务时才运行代码。
这是我当前的代码:
if(gradle.taskGraph.hasTask("flywayMigrate")) {
flyway {
def dbCode, dbUser, dbPassword, dbUrl
if (!project.hasProperty("db_env")) {
throw new GradleException("Expected db_env property to be supplied for migration task. Can be passed" +
" at command line e.g. [gradle -Pdb_env=ex1 flywayMigrate]")
} else {
// do stuff
}
user = balh
password = blah
url …Run Code Online (Sandbox Code Playgroud) SonarQube 有一个“自上一版本”过滤器。Sonar 如何确定版本号?我在 pom 文件中有一个带有版本号的 Maven 项目 - Sonar 是否足够聪明来询问这个?
如何阻止一个线程的事务读取一行,直到另一个事务完成处理该行?
我在 Oracle 11 DB 上有一个触发器表。触发器表上的一行有一个状态标志,用于指示是否需要发生某个流程 - 假设它要触发一封电子邮件。有一个批处理进程定期轮询触发器表。其过程是:
但我正在集群环境中运行我的应用程序。因此,批处理过程可能有多个版本并行拉下触发器。我想确保竞争的批处理过程不会拉下相同的触发器并执行相同的处理,即发送相同的电子邮件。
我正在查看 Oracle SELECT FOR UPDATE 子句。但是,我不是 100% 清楚这是否符合我的要求。我需要线程 A 锁定触发器行,并阻止线程 B 读取或写入触发器行。SELECT FOR UPDATE 是否阻止线程 B 进行读取和写入或仅阻止线程 B 进行写入,这并不是 100% 清楚。我需要前者。
欢迎想法。
休眠3.2.6 Oracle 11.x
我正在查看的代码使用此行锁定表行以进行更新:
Query query = createQuery("from MyTable t where t.col1 = :param1");
query.setParameter("param1", "blah");
query.setLockMode("s", LockMode.WRITE);
return (SysType) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
该代码随后执行此操作:
getSession().saveOrUpdate(sysType);
getSession().flush();
Run Code Online (Sandbox Code Playgroud)
其中getSession()返回一个Hibernate会话。
我的问题是-何时释放锁?如果sysType对象自读取以来尚未更新,则DB是否由saveOrUpdate调用,并且是否释放了锁?
我正在查看我的应用程序的问题,我怀疑这是由于该行被锁定并且该锁未释放而导致阻止其他读取而引起的。
我有一个这样的课:
public class Utils {
public static void doSomething() {
// doSomething code
}
public static void doSomethingElse() {
// doSomethingElse code
}
}
Run Code Online (Sandbox Code Playgroud)
我希望两个方法同步但不能彼此同步,即没有两个线程可以同时处理doSomething()方法,没有两个线程可以同时处理doSomethingElse()但是线程可以处理doSomething()方法和另一个方法同时处理doSomethingElse()方法.
我实现了这样的事情:
public class Utils {
private static final String DO_SOMETHING_LOCK = "DO_SOMETHING_LOCK";
private static final String DO_SOMETHING_ELSE_LOCK = "DO_SOMETHING_ELSE_LOCK";
public static void doSomething() {
synchronized(DO_SOMETHING_LOCK) {
// doSomething code
}
}
public static void doSomethingElse() {
synchronized(DO_SOMETHING_ELSE_LOCK) {
// doSomethingElse code
}
}
Run Code Online (Sandbox Code Playgroud)
我看到Scott Stanchfield的回应在这里采用了类似的方法:
但这是最好的方法吗?对我来说似乎有些笨拙,创造了两个对象,只是用于锁定 - 有更好的方法吗?
在Oracle DB上,如果我在同一列上有一个Nullable列和一个检查约束,将值限制为'ABC'或'DEF',我可以在该列中插入一个空值的行(假定为null)不是约束值之一)?