我已经构建了一个Java程序作为服务器上数据库的前端,我正在尝试使用SSL来加密客户端和服务器之间的流量.这是我发出的用于创建服务器证书的命令:
keytool -genkey -alias localhost -keyalg RSA -keypass kpass123 -storepass kpass123 -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)
这是相关代码:
System.setProperty("javax.net.ssl.keyStore",
"G:/Data/Android_Project/keystore.jks");
System.setProperty("javax.net.ssl.keyPassword", "kpass123");
SSLServerSocketFactory factory =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket accessSocket =
(SSLServerSocket)factory.createServerSocket(DB_ACCESS_PORT);
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我抓住了这个:
java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供者:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
我还发现"KeyPairGenerator"服务有DIFFIEHELLMAN,DSA,RSA算法,而"SSLContext"有算法SSL,TLS,SSLV3,DEFAULT,TLSV1.
我是否需要找到一些方法将RSA安装到SSLContext服务中?我甚至在看正确的服务吗?我不应该使用RSA吗?
我是整个SSL - 安全 - 证书的新手,它让我感到震惊的是,当他们应该访问相同的证书时,这些不同的服务中的每一个都没有相同的算法.
在我的Android应用程序中,主Activity有时会启动一个Thread来从服务器加载数据.该线程修改应用程序的数据库并编辑一些重要文件.AFAIK,似乎这个线程继续执行.如果Android进入低内存状态并决定终止整个应用程序,该线程会发生什么?这个线程可能会过早死亡吗?如果是这样,有什么方法我可以看到该线程被杀死,并做一些事情吗?
我问,因为这个线程修改了数据库中的重要数据,如果它突然被杀死,应用程序可能会停止正常运行.
看来SQLite默认不强制执行外键.我正在使用sqlitejdbc-v056.jar并且我已经读过使用PRAGMA foreign_keys = ON;将打开外键约束,并且需要在每个连接的基础上打开它.
我的问题是:我需要执行哪些Java语句来打开此命令?我试过了:
connection.createStatement().execute("PRAGMA foreign_keys = ON");
Run Code Online (Sandbox Code Playgroud)
和
Properties properties = new Properties();
properties.setProperty("PRAGMA foreign_keys", "ON");
connection = DriverManager.getConnection("jdbc:sqlite:test.db", properties);
Run Code Online (Sandbox Code Playgroud)
和
connection = DriverManager.getConnection("jdbc:sqlite:test.db;foreign keys=true;");
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用.这里有什么我想念的吗?
我已经看到了这个答案,我想做同样的事情,只使用JDBC.
所以这里是交易.我正在开发一个Android应用程序(虽然它可以像任何其他移动平台一样容易)偶尔会向服务器发送查询(编写的是Java).然后,该服务器将在MySQL数据库中搜索查询,并将结果发送回Android.虽然这听起来很通用,但这里有一些细节:
每次查询时,Android都会与服务器建立新的TCP连接.服务器地理位置接近,Android可能会移动很多,而且,由于Android应用程序可能只运行几个小时而只发送一些查询,这似乎是资源的最佳使用.
服务器可能同时拥有数百个(或甚至数千个)这些查询.
由于每个查询都在自己的Thread中运行,因此每个查询至少需要自己的Statement(并且可以拥有自己的Connection).
现在,服务器设置为与数据库建立一个连接,然后为每个查询创建一个新的Statement.我对那些有一些数据库经验的人的问题(特别是MySQL,因为它是一个MySQL数据库)是:
a)从单个连接创建一个每个线程的语句是否可以安全线程?据我所知,只是寻找确认.
b)多线程是否有任何线程安全的方式来使用单个PreparedStatement?这些查询都将完全相同,并且由于每个线程只执行一个查询然后返回,这将是理想的.
c)我应该为每个线程创建一个新的连接,还是从单个连接生成新的语句更好?我认为单个Connection在性能方面会更好,但我不知道建立数据库连接的开销是多少.
d)最好是为所有这些使用存储的SQL过程吗?
我们非常感谢您对这些事项的任何提示/意见/建议.
编辑:
为了澄清,android通过网络向服务器发送查询,然后服务器查询数据库.android不直接与数据库通信.我主要想知道服务器数据库连接的最佳实践.
我知道,这似乎是一个愚蠢的问题,你会期望任何集合上size()的时间复杂度都是O(1) - 但我发现我的代码中需要调用大小的"优化" ()实际上减慢了速度.
那么,Java中的Sets的size()的时间复杂度是多少?
我的代码是一个递归算法的实现,用于在图中找到最大派系(不重要).基本上,优化只是检查两个集合是否具有相同的大小(这些集合是以任何一种方式构造的),并且如果它们的大小相等,则仅允许再一次递归调用(在此之后停止递归).
这是我的代码的(简化)版本:
private static void recursivelyFindMaximalCliques(Set<Integer> subGraph, Set<Integer> candidates, Set<Integer> notCandidates) {
boolean noFurtherCliques = false;
Iterator<Integer> candidateIterator = candidates.iterator();
while (candidateIterator.hasNext()) {
int nextCandidate = candidateIterator.next();
candidateIterator.remove();
subGraph.add(nextCandidate);
Set<Integer> neighbors = getNeighbors(nextCandidate);
Set<Integer> newCandidates = calculateIntersection(candidates, neighbors);
Set<Integer> newNotCandidates = calculateIntersection(notCandidates, neighbors);
//if (newCandidates.size() == candidates.size())
// noFurtherCliques = true;
recursivelyFindMaximalCliques(subGraph, newCandidates, newNotCandidates);
//if (noFurtherCliques)
// return;
subGraph.set.remove(nextCandidate);
notCandidates.set.add(nextCandidate);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经注释掉的那些是有问题的 - 你可以看到它们检查newCandidates和候选集的大小是否相同,如果它们是,则递归只允许更深一层.
当行被取消注释时,代码运行速度减慢约10% - 无论使用的集合是HashSets,TreeSet还是LinkedHashSets,都是如此.这没有任何意义,因为这些行确保将有FEWER递归调用.
我唯一可以假设的是对集合上size()的调用需要很长时间.在Java中调用sets上的size()是否需要比O(1)更长的时间?
编辑
既然有人问过,这里是calculateIntersection():
private static IntegerSet calculateIntersection(Set<Integer> …Run Code Online (Sandbox Code Playgroud) 我正在使用BufferedReader.我只是想知道如何在每一行从键盘读取值后清除BufferedReader.我喜欢用
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String male = br.readLine();
Run Code Online (Sandbox Code Playgroud)
请帮帮我.