我们公司讨论了如何在我们的java源代码中引用某些数据库条目。 情况如下:
java Web 应用程序连接到由 SQL 脚本设置的 MySQL 数据库,JPA/Hibernate 用于 ORM。在这个脚本中,我们在“roles”表中插入了 3 个角色(即用户可以在 Web 应用程序中拥有的角色,即用户表具有角色表的外键)。这些角色具有 SQL 脚本中给出的预定义主键/ID (BIGINT) 和名称 (VARCHAR)。这些角色不用于安全框架,而是用于业务逻辑。目前它看起来像这样:
if(user.getRole.getId()==1) {
// user is in role A
} else if(user.getRole().getId()==2) {
// user is in role B
} ...
Run Code Online (Sandbox Code Playgroud)
由于角色必须在编译时由源代码知道(因为逻辑取决于它们),我们必须检查用户是否具有某些角色。现在的问题是如何做到这一点。我们讨论过:
a) 通过 ID 或名称更好地检查 b) 使用字符串/长常量或枚举来检查相等性
a) 我更喜欢检查 ID(因为它不太可能改变,因为我们在数据库设置时使用脚本插入 ID),角色名称更有可能在应用程序的生命周期内改变。
b) 我更喜欢使用常量,因为我不喜欢依赖枚举索引/序数。此外,我们在这里不需要类型安全。我在枚举中看到的唯一优点是它很容易获取所有值,afaik 只有在常量的情况下才有可能通过反射。但是由于我们在数据库上定义了所有角色,因此可以在运行时从那里获取它们。
有什么建议?
我有一个项目使用Spring(context,transaction,apect)4.1.6.RELEASE和spring-data-jpa 1.8.0.RELEASE并遇到奇怪的错误,假设是由xsd验证引起的.但是,我无法确定原因.奇怪的是,项目运行正常,我的所有bean都被正确识别.
我正在使用Eclipse luna和Spring Tools Suite插件
我从applicationContext.xml中删除了除"jpa:"行之外的所有内容,这会导致问题.已使用STS插件创建xml.
我试图从xsds中删除版本号,但没有成功.
我尝试从 Java 程序切换Runtime.exec(command)到ProcessBuilder执行 ImageMagick 。convert转换的选项是从用户作为字符串传入的,因此我无法轻松地分离参数以将它们单独传递给 的ProcessBuilder构造函数。在(Unix)命令行上运行的实际命令是
convert -colorspace gray -enhance -density 300 in.pdf out.pdf
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它工作:
public class Demo {
public static void main(String[] args) throws IOException, InterruptedException {
String convertOptions = "-colorspace gray -enhance -density 300"; // arguments passed in at runtime
ProcessBuilder bp = new ProcessBuilder(new String []{"convert",convertOptions,"in.pdf","out.pdf"});
Process process = bp.start();
process.waitFor();
}
}
Run Code Online (Sandbox Code Playgroud)
目前,代码只是运行
我在将多页 pdf 转换为 tiff 时遇到以下问题:
gswin64c.exe -dNumRenderingThreads=8 -dQUIET -dNOPAUSE -dBATCH -sDEVICE=tiffscaled -sCompression=g4 -r300 -o out.tiff in.pdf
Run Code Online (Sandbox Code Playgroud)
in.pdf是带有嵌入图像(即扫描页)的多页 pdf。
从命令行运行时(“gswin64c.exe 停止工作”),在我的 Windows 64 位环境中,命令崩溃(但并不总是在同一页面上),没有 STDERR 写入控制台。我使用最新的 Ghostscript 版本(9.18)。
仅当我使用-dNumRenderingThreads=1.
这可能是什么原因?
编辑:在版本 9.15 中,转换运行良好,从 9.16 开始,它不再工作。
系统日志错误条目显示:
Faulting application name: gswin64c.exe, version: 0.0.0.0, time stamp: 0x56123d41
Faulting module name: gsdll64.dll, version: 0.0.0.0, time stamp: 0x56123d3d
Exception code: 0xc0000005
Fault offset: 0x000000000007b930
Faulting process id: 0x197c
Faulting application start time: 0x01d16325677e4e24
Faulting application path: C:\Program Files\gs\gs9.18\bin\gswin64c.exe
Faulting module path: C:\Program …Run Code Online (Sandbox Code Playgroud) 我尝试Array[Double]使用该slice方法切片1D .我写了一个方法,它将开始和结束索引作为元组返回(Int,Int).
def getSliceRange(): (Int,Int) = {
val start = ...
val end = ...
return (start,end)
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能getSliceRange直接使用返回值?
我试过了:
myArray.slice.tupled(getSliceRange())
Run Code Online (Sandbox Code Playgroud)
但这给了我一个编译错误:
Error:(162, 13) missing arguments for method slice in trait IndexedSeqOptimized;
follow this method with `_' if you want to treat it as a partially applied function
myArray.slice.tupled(getSliceRange())
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JNA同时操作本机的,非线程安全的Fortran库.由于库不是线程安全的,我尝试实例化同一个库的不同副本,但显然它们似乎共享内存地址.如果我修改一个库中的一个变量,则将另一个库中的变量修改为.此行为使得无法在单独的线程中以完全方式运行它们.
以下代码示例演示了我的意思:
code.f:
subroutine set(var)
implicit none
integer var,n
common/conc/n
n=var
end subroutine
subroutine get(var)
implicit none
integer var,n
common/conc/n
var=n
end subroutine
Run Code Online (Sandbox Code Playgroud)
此文件的编译和复制如下:
gfortran -shared -O2 code.f -o mylib.so -fPIC
cp mylib.so mylib_copy.so
Run Code Online (Sandbox Code Playgroud)
然后我使用JNA访问这两个:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
public class JNA {
public interface MyLib extends Library {
public void set_(IntByReference var);
public void get_(IntByReference var);
}
public static void main(String[] args) {
System.setProperty("jna.library.path", ".");
MyLib lib = (MyLib) Native.loadLibrary("mylib.so", MyLib.class);
MyLib lib_copy = (MyLib) Native.loadLibrary("mylib_copy.so", MyLib.class); …Run Code Online (Sandbox Code Playgroud) 我尝试编写一个应该使用周围范围变量的方法.问题是我无法访问定义变量的代码部分.像这样的东西:
object Example extends App {
val myvar = 1.0 // cannot change that code
def myMethod()(implicit value:Double) = {
print(value)
}
myMethod()
}
Run Code Online (Sandbox Code Playgroud)
这失败了,因为myMethod无法找到合适的隐含value.
value除了定义指向的新隐式变量之外,还有一种方法可以在定义之后将其"标记" 为隐式value吗?
背景:我们使用Spark-Notebook 自动创建SparkContext(命名sc).作为sc社区中此变量的一个众所周知的名称,我们不希望引入另一个变量名称.
我正在使用 JNA 来加载本机库:
MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary.so", MyLibrary.class);
Run Code Online (Sandbox Code Playgroud)
现在我想清理并处置图书馆。我已经读过该dispose方法,但这是在类上定义的NativeLibrary,我应该如何调用它?
无论如何,有必要这样做吗?我正在大规模地将 jna 与 Apache Spark 一起使用,因此我加载了该库数千次,我想知道如果我明确调用 nit ,是否还有任何资源保持打开状态dispose?
编辑:我已经看到了问题Jna, Unload Dll from java classdynamic,但它没有为我的问题提供解决方案。
没有公认的答案。人们建议调用NativeLibrary.dispose(),但NativeLibrary. 如果我尝试转换我的库实例(类型为Library),则会收到类转换异常。
我尝试使用最新的Scala-Plugin在IntelliJ 2016.3中运行带有Scala 2.10.5的Apache Spark 1.6.3。该项目是一个maven项目。
如果我尝试使用创建一个新的SparkContext:
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf.setAppName("Spark-Scala-Demo").setMaster("local[*]"))
Run Code Online (Sandbox Code Playgroud)
我懂了
17/01/16 14:05:28 ERROR SparkContext: Error initializing SparkContext.
java.lang.ClassNotFoundException: org.apache.spark.rpc.netty.NettyRpcEnvFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.util.Utils$.classForName(Utils.scala:175)
at org.apache.spark.rpc.RpcEnv$.getRpcEnvFactory(RpcEnv.scala:41)
Run Code Online (Sandbox Code Playgroud)
该代码在IntelliJ scala控制台以及定义主方法的普通类中都可以正常运行。
那么,scala工作表有什么不同?
spark如何确定使用后的分区数orderBy?我一直认为生成的数据框有spark.sql.shuffle.partitions,但这似乎不是真的:
val df = (1 to 10000).map(i => ("a",i)).toDF("n","i").repartition(10).cache
df.orderBy($"i").rdd.getNumPartitions // = 200 (=spark.sql.shuffle.partitions)
df.orderBy($"n").rdd.getNumPartitions // = 2
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,spark 都可以+- Exchange rangepartitioning(i/n ASC NULLS FIRST, 200),那么第二种情况下的分区数怎么会是 2?