- CarieVinne
-
这个并不难实现,你在一个类里定义一个静态字段(属性),初始化为0,然后在类的构造函数里对它加1,这样你可以随时读取这个字段(属性)的值就知道该类被实例化了多少次。如果你希望得到的是现有实例的数量,还可以在析构函数(更科学地是让你的类实现IDisposible接口),在里面对字段减1。
public class CountableClass : IDisposable
{
public int Instances { get; private set; } = 0;
public CountableClass()
{
Instances++;
}
public void Dispose()
{
if (Instances > 0)
{
Instances--;
}
}
}
- 牛云
-
没有,据我所知所有语言都没有.
这种需求可以自定义来实现.
instances是什么意思
实例,意思是对象的实例。2023-08-04 09:08:214
abaqus装配里的cut instances怎么用
1、在Assembly模块中选中Merge/cutinstances。2、然后选中需要结合的零件。在左侧状态栏part一项中会看到生成的新零件,可以把之前的分开的零件删掉。2023-08-04 09:08:341
mysql 参数调优(11)之innodb_buffer_pool_instances设置多个缓冲池实例
MySQL 5.5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段。在5.5版本这个对提升吞吐量帮助很小,然后在MySQL 5.6版本这个提升就非常大了,所以在MySQL5.5中你可能会保守地设置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以设置为8-16个缓冲池实例。设置后观察会觉得性能提高不大,但在大多数高负载情况下,它应该会有不错的表现。对了,不要指望这个设置能减少你单个查询的响应时间。这个是在高并发负载的服务器上才看得出区别。比如多个线程同时做许多事情。 5.7、8.0 下INNODB_BUFFER_POOL_INSTANCES默认为1,若mysql存在高并发和高负载访问,设置为1则会造成大量线程对BUFFER_POOL的单实例互斥锁竞争,这样会消耗一定量的性能的。 pool_instances 可以设置为cpu核心数,它的作用是: 1)对于缓冲池在数千兆字节范围内的系统,通过减少争用不同线程对缓存页面进行读写的争用,将缓冲池划分为多个单独的实例可以提高并发性。可以类比为 java中的 ThreadLocal 线程本地变量 就是为每个线程维护一个buffer pool实例,这样就不用去争用同一个实例了。相当于减少高并发下mysql对INNODB_BUFFER缓冲池的争用。 2)使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表, 刷新列表, LRU和连接到缓冲池的所有其他数据结构,并受其自己的缓冲池互斥量保护。2023-08-04 09:08:421
从java中调用weka中的分类函数的问题
weka不是机器学习吗,在学习中。可能是导入的包有问题,建议重新导入下,要全了。2023-08-04 09:09:033
in each instance是什么意思
在每个实例例句In each instance, he dispatches a cease-and-desist letter.在每个案例中,他都会发出一份要求对方终止剽窃行为的信函2023-08-04 09:09:112
求教WEKA高手,Instances类的classAttribute和classIndex这两个成员函数
好深奥的样子2023-08-04 09:09:193
There are rare instances when justice almost ceases to be an abstract concept.
定语从句在句中做定语,修饰一个名词或代词。而同位语从句用以说明名词表示的具体内容,对另一个名词或代词进行修饰,限定或说明。这句话里名词rare instances极少数情况,这个极少数情况是指正义不在是一个抽象的概念。justice almost ceases to be an abstract concept并不是定义rare instances,而是对这个内容给予了说明,所以属于同位语从句。2023-08-04 09:09:261
如何查看和获取SQL Server实例名
SELECT @@SERVERNAME2023-08-04 09:09:434
oracle 中user_tables表各字段意思
table cache ,指将table 缓存后 放在LRU hot端,但这种cache 仍很容易被flush 出buffer_cache2023-08-04 09:09:523
单例模式代码怎么写?
单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。 可分为eager模式,示例代码如下: Java代码 1.class EagerSingleton{ 2. private static final EagerSingleton m_instance = new EagerSingleton(); 3. private EagerSingleton(){} 4. public static EagerSingleton getInstance(){ 5. return m_instance; 6. } 7.} class EagerSingleton{ private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return m_instance; } } 和 lazy模式,示例代码如下: Java代码 1.class LazySingleton{ 2. private static LazySingleton m_instance = null; 3. private LazySingleton(){} 4. public synchronized static getInstance(){ 5. if(m_instance == null){ 6. m_instance = new LazySingleton(); 7. } 8. return m_instance; 9. } 10.} class LazySingleton{ private static LazySingleton m_instance = null; private LazySingleton(){} public synchronized static getInstance(){ if(m_instance == null){ m_instance = new LazySingleton(); } return m_instance; } } java源码中,Runtime.getRuntime()就是单例的一个例子。 单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。 多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。 示例代码如下: Java代码 1.class Multiton{ 2. private final int INSTANCE_SIZE = 10; 3. private static Map instances = new HashMap(INSTANCE_SIZE); 4. private String name; 5. private Multiton(){} 6. private Multiton(String name){ 7. this.name = name; 8. } 9. public synchronized static getInstance(String name){ 10. if(instances.containsKey(name)){ 11. return instances.get(name); 12. } 13. else{ 14. ins = new Multiton(name); 15. instances.put(name, ins); 16. return ins; 17. } 18. } 19.} class Multiton{ private final int INSTANCE_SIZE = 10; private static Map instances = new HashMap(INSTANCE_SIZE); private String name; private Multiton(){} private Multiton(String name){ this.name = name; } public synchronized static getInstance(String name){ if(instances.containsKey(name)){ return instances.get(name); } else{ ins = new Multiton(name); instances.put(name, ins); return ins; } } } [nextpage] 一个实用的例子就是KeyGenerator, 示例代码如下: Java代码 1.class KeyGenerator{ 2. private final int POOL_SIZE = 20; 3. private static Map instances = new HashMap(16); 4. private KeyInfo keyinfo; 5. private KeyGenerator(){} 6. private KeyGenerator(String keyName){ 7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName); 8. } 9. public synchronized static getInstance(String keyName){ 10. if(instances.containsKey(keyName)){ 11. return (KeyGenerator)instances.get(keyName); 12. } 13. else{ 14. keyGen = new KeyGenerator(keyName); 15. instances.put(name, keyGen); 16. return keyGen; 17. } 18. } 19. public synzhronized int getNextKey(){ 20. return keyinfo.getNextKey(); 21. } 22. } class KeyGenerator{ private final int POOL_SIZE = 20; private static Map instances = new HashMap(16); private KeyInfo keyinfo; private KeyGenerator(){} private KeyGenerator(String keyName){ this.keyinfo = new KeyInfo(POOL_SIZE, keyName); } public synchronized static getInstance(String keyName){ if(instances.containsKey(keyName)){ return (KeyGenerator)instances.get(keyName); } else{ keyGen = new KeyGenerator(keyName); instances.put(name, keyGen); return keyGen; } } public synzhronized int getNextKey(){ return keyinfo.getNextKey(); } }2023-08-04 09:10:011
java中的单例模式的代码怎么写
楼主可以去网页里面搜一下Singleton2023-08-04 09:10:266
weka在什么情况下summary中才会出现correctly classified instance? 我的结果中为什么没有
只要试验正常,数据能够正常分类,都会出现“correctly classified instance”,如果你的结果里面没有,说明数据集不符合分类挖掘要求。相应地,还会有“Incorrectly Classified Instances”,这两个数据加起来就是样本总量。“correctly classified instance”这个数据能够反映训练的分类器的分类准确率。例如,我用weka的示例数据集“iris”得到的分类结果:=== Run information ===Scheme:weka.classifiers.trees.J48 -C 0.25 -M 2Relation: irisInstances: 150Attributes: 5 sepallength sepalwidth petallength petalwidth classTest mode:10-fold cross-validation=== Classifier model (full training set) ===J48 pruned tree------------------petalwidth <= 0.6: Iris-setosa (50.0)petalwidth > 0.6| petalwidth <= 1.7| | petallength <= 4.9: Iris-versicolor (48.0/1.0)| | petallength > 4.9| | | petalwidth <= 1.5: Iris-virginica (3.0)| | | petalwidth > 1.5: Iris-versicolor (3.0/1.0)| petalwidth > 1.7: Iris-virginica (46.0/1.0)Number of Leaves : 5Size of the tree : 9Time taken to build model: 0.05 seconds=== Stratified cross-validation ====== Summary ===Correctly Classified Instances 144 96 %Incorrectly Classified Instances 6 4 %Kappa statistic 0.94 Mean absolute error 0.035 Root mean squared error 0.1586Relative absolute error 7.8705 %Root relative squared error 33.6353 %Total Number of Instances 150 === Detailed Accuracy By Class === TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.98 0 1 0.98 0.99 0.99 Iris-setosa 0.94 0.03 0.94 0.94 0.94 0.952 Iris-versicolor 0.96 0.03 0.941 0.96 0.95 0.961 Iris-virginicaWeighted Avg. 0.96 0.02 0.96 0.96 0.96 0.968=== Confusion Matrix === a b c <-- classified as 49 1 0 | a = Iris-setosa 0 47 3 | b = Iris-versicolor 0 2 48 | c = Iris-virginica2023-08-04 09:10:431
k-means算法怎么为对称矩阵进行聚类?
几种典型的聚类融合算法:1.基于超图划分的聚类融合算法(1)Cluster-based Similarity Partitioning Algorithm(GSPA)(2)Hyper Graph-Partitioning Algorithm(HGPA)(3)Meta-Clustering Algorithm(MCLA)2.基于关联矩阵的聚类融合算法Voting-K-Means算法。3.基于投票策略的聚类融合算法w-vote是一种典型的基于加权投票的聚类融合算法。同时还有基于互信息的聚类融合算法和基于有限混合模型的聚类融合算法。二、基于关联矩阵的聚类融合算法——Voting-K-Means算法Voting-K-Means算法是一种基于关联矩阵的聚类融合算法,关联矩阵的每一行和每一列代表一个数据点,关联矩阵的元素表示数据集中数据点对共同出现在同一个簇中的概率。算法过程:1.在一个数据集上得到若干个聚类成员;2.依次扫描这些聚类成员,如果数据点i和j在某个聚类成员中被划分到同一个簇中,那么就在关联矩阵对应的位置计数加1;关联矩阵中的元素值越大,说明该元素对应的两个数据点被划分到同一个簇中的概率越大;3.得到关联矩阵之后,Voting-K-Means算法依次检查关联矩阵中的每个元素,如果它的值大于算法预先设定的阀值,就把这个元素对应的两个数据点划分到同一个簇中。Voting-K-Means算法的优缺点:Voting-K-Means算法不需要设置任何参数,在聚类融合的过程中可以自动地的选择簇的个数 并且可以处理任意形状的簇。因为Voting-K-Means算法在聚类融合过程中是根据两个数据点共同出现在同一个簇中的可能性大小对它们进行划分的,所以只要两个数据点距离足够近,它们就会被划分到一个簇中。Voting-K-Means算法的缺点是时间复杂度较高,它的时间复杂度是O(n^2);需要较多的聚类成员,如果聚类成员达不到一定规模,那么关联矩阵就不能准确反映出两个数据点出现在同一个簇的概率。package clustering;import java.io.FileWriter;import weka.clusterers.ClusterEvaluation;import weka.clusterers.SimpleKMeans;import weka.core.DistanceFunction;import weka.core.EuclideanDistance;import weka.core.Instances;import weka.core.converters.ConverterUtils.DataSource;import weka.filters.unsupervised.attribute.Remove;public class Votingkmeans2 extends SimpleKMeans { /** 生成的序列号 */ private static final long serialVersionUID = 1557181390469997876L; /** 划分的簇数 */ private int m_NumClusters; /** 每个划分的簇中的实例的数量 */ public int[] m_ClusterSizes; /** 使用的距离函数,这里是欧几里德距离 */ protected DistanceFunction m_DistanceFunction = new EuclideanDistance(); /** 实例的簇号赋值 */ protected int[] m_Assignments; /** 设定聚类成员融合阀值 */ private final static double THREASOD = 0.5; /** 生成一个聚类器 */ public void buildClusterer(Instances data) throws Exception{ final int numinst = data.numInstances(); // 数据集的大小 double [][]association = new double[numinst][numinst]; // 定义并初始化一个关联矩阵 int numIteration = 40; // 设置生成的聚类成员数 final int k = (int)Math.sqrt(numinst); // 设置K-Means聚类算法参数——簇数 for(int i = 0; i < numIteration; i++) { if(data.classIndex() == -1) data.setClassIndex(data.numAttributes() - 1); // 索引是从0开始 String[] filteroption = new String[2]; filteroption[0] = "-R"; filteroption[1] = String.valueOf(data.classIndex() + 1);// 索引是从1开始 Remove remove = new Remove(); remove.setOptions(filteroption); remove.setInputFormat(data); /* 使用过滤器模式生成新的数据集;新数据集是去掉类标签之后的数据集 */ Instances newdata = weka.filters.Filter.useFilter(data, remove); /* 生成一个K-Means聚类器 */ SimpleKMeans sm = new SimpleKMeans(); sm.setNumClusters(k); sm.setPreserveInstancesOrder(true); // 保持数据集实例的原始顺序 sm.setSeed(i); // 通过设置不同的种子,设置不同的簇初始中心点,从而得到不同的聚类结果 sm.buildClusterer(newdata); int[] assigm = sm.getAssignments(); // 得到数据集各个实例的赋值 /* 建立关联矩阵 */ for(int j = 0; j < numinst; j++) { for(int m = j; m < numinst; m++) { if(assigm[j] == assigm[m]) { association[j][m] = association[j][m] + 1.0 / numIteration ; } } } } System.out.println(); /* 将生成的关联矩阵写入.txt文件(注:生成的txt文本文件在e:/result.txt中) */ FileWriter fw = new FileWriter("e://result.txt"); for(int j = 0; j < numinst; j++) { for(int m = j; m < numinst; m++) { //由于关联矩阵是对称的,为了改进算法的效率,只计算矩阵的上三角 String number = String.format("%8.2f", association[j][m]); fw.write(number); } fw.write(" "); } /* 处理关联矩阵,分别考虑了两种情况 :1.关联矩阵中某个元素对应的两个数据点已经被划分到了不同的簇中 * 2.两个数据点中有一个或者两个都没有被划分到某个簇中。 */ int[] flag = new int[numinst]; int[] flagk = new int[k]; int[] finallabel = new int[numinst]; for(int m = 0; m < numinst; m++) { for(int n = m; n < numinst; n++) { if(association[m][n] > THREASOD) { if(flag[m] == 0 && flag[n] == 0) { // 两个数据点都没有被划分到某个簇中, int i = 0; // 将他们划分到同一个簇中即可 while (i < k && flagk[i] == 1) i = i + 1; finallabel[m] = i; finallabel[n] = i; flag[m] = 1; flag[n] = 1; flagk[i] = 1; } else if (flag[m] == 0 && flag[n] == 1) { // 两个数据点中有一个没有被划分到某个簇中, finallabel[m] = finallabel[n]; // 将他们划分到同一个簇中即可 flag[m] = 1; } else if (flag[m] == 1 && flag[n] == 0) { finallabel[n] = finallabel[m]; flag[n] = 1; } else if (flag[m] == 1 && flag[n] == 1 && finallabel[m] != finallabel[n]) { // 两个数据点已被划分到了不同的簇中, flagk[finallabel[n]] = 0; // 将它们所在的簇合并 int temp = finallabel[n]; for(int i = 0; i < numinst; i++) { if(finallabel[i] == temp) finallabel[i] = finallabel[m]; } } } } } m_Assignments = new int[numinst]; System.out.println("基于关联矩阵的聚类融合算法——Voting-K-Means算法的最终聚类结果"); for(int i = 0; i < numinst; i++) { m_Assignments[i] = finallabel[i]; System.out.print(finallabel[i] + " "); if((i+1) % 50 == 0) System.out.println(); } for(int i = 0; i < k; i++) { if(flagk[i] == 1) m_NumClusters++; } } /** * return a string describing this clusterer * * @return a description of the clusterer as a string */ public String toString() { return "Voting-KMeans "; } public static void main(String []args) { try {String filename="e://weka-data//iris.arff"; Instances data = DataSource.read(filename); Votingkmeans2 vk = new Votingkmeans2(); vk.buildClusterer(data); /* 要生成Voting-K-Means的聚类评估结果包括准确率等需要覆盖重写toString()方法; * 因为没有覆盖重写,所以这里生产的评估结果没有具体内容。 */ ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(vk); eval.evaluateClusterer(new Instances(data)); System.out.println(eval.clusterResultsToString()); } catch (Exception e) { e.printStackTrace(); }}}分析代码时注意:得到的类成员变量m_Assignments就是最终Voting-K-Means聚类结果;由于是采用了开源机器学习软件Weka中实现的SimpleKMeans聚类算法,初始时要指定簇的个数,这里是数据集大小开根号向下取整;指定的阀值为0.5,即当关联矩阵元素的值大于阀值时,才对该元素对应的两个数据点进行融合,划分到一个簇中,考虑两种情况,代码注释已有,这里不再详述。但聚类融合的实验结果并不理想,莺尾花数据集irsi.arff是数据挖掘实验中最常用的数据集,原数据集共有三个类;但本实验进行四十个聚类成员的融合,其最终聚类结果划分成两个簇;其原因可能有两个:一是算法本身的问题,需要使用其他更加优化的聚类融合算法;二是实现上的问题,主要就在聚类结果的融合上,需要进行一步对照关联矩阵进行逻辑上的分析,找出代码中的问题。关联矩阵文本文件http://download.csdn.net/detail/lhkaikai/7294323---------------------本文来自 Turingkk 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lhkaikai/article/details/25004823?utm_source=copy2023-08-04 09:10:531
魔兽世界重置宏的命令
没明白楼主意思 。2023-08-04 09:11:034
ViewModel的原理
众所周知,ViewModel的作用在于以可感知生命周期的方式存储与管理UI相关的数据,它允许数据在例如屏幕旋转这样的配置发生变化时得以保存,那系统又是如何做到保存ViewModel的呢,让我们从源码中去溯本追源吧。很显然,实现该接口的类需要能够提供一个ViewModelStore,而ViewModelStore即为用于存储ViewModel对象的仓库,其内部通过一个HashMap管理ViewModel。Activity的attach方法是在Activity的加载流程中由ActivityThread的performLaunchActivity调用的,调用时传入的是ActivityRecordClient中的NonConfigurationInstances对象,那ActivityRecordClient又是在什么时候保存的NonConfigurationInstances对象的呢,这就要从Activity因为配置变化被销毁时查起了。 当Activity因为配置变化被销毁时,在其销毁流程中ActivityThread会调用performDestroyActivity方法,该方法内部会回调Activity的retainNonConfigurationInstances方法获取NonConfigurationInstances并保存在ActivityRecordClient中以备之后Activity重建之需,以下是retainNonConfigurationInstances方法的部分流程:onRetainNonConfigurationInstances方法的主要逻辑就是创建了一个NonConfigurationInstances对象(此NonConfigurationInstances类与前头的NonConfigurationInstances类不是同一个类),并将当前Activity的ViewModelStore保存到了所创建的对象的viewModelStore变量中,从而使得Activity在销毁后重建时能获取到销毁前的ViewModelStore,进而可获取到销毁前的ViewModel。onRetainNoConfigurationInstance方法返回的NonConfigurationInstance对象最终被存储到了retainNonConfigurationInstances方法中创建的NonConfigurationInstances对象的activity变量里。2023-08-04 09:11:451
3D MAX渲染的时候一直在读updating instances
你用的什么渲染器?场景的模型量很大么?2023-08-04 09:11:544
英语长句理解
1 instance 举例所以此处in instances of 译作 比如说在。。。中2 在定语从句中作award的宾语成分。3 词组 rate 。。。。。as 把什么看做什么意思 看做可能实现的最大利益4 in作状语5 shop是商店的意思 此句不是说在修理 而是说你没有车么?(你的车还在商店没买来么?)希望有帮助2023-08-04 09:12:055
求Cadence ConceptHDL在Export physical时“Models assigned to instances cannot be found”解决办法
原因在于部分器件库的part.ptf指定了DEFAULT_SI_MODEL,然而此所谓的默认模型却是不存在的,可以通过TOOLS菜单下的MODEL ASSIGNMENT列表看到,有问题的库的SI_MODEL是红色的。解决办法:修改器件器,删除此DEFAULT_SI_MODEL属性即可解决问题。2023-08-04 09:12:321
innodb buffer pool 有什么用
摘要:1 innodb_buffer_pool_instances可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。2 innodb_buffer_pool_instances 参数显著的影响测试结果,特别是非常高的 I/O 负载时。3 实验环境下, innodb_buffer_pool_instances=8 在很小的 buffer_pool 大小时有很大的不同,而使用大的 buffer_pool 时,innodb_buffer_pool_instances=1 的表现最棒。1 定义The number of regions that the InnoDB buffer pool is divided into. For systems with buffer pools in the multi-gigabyte range, dividing the buffer pool into separate instances can improve concurrency, by reducing contention as different threads read and write to cached pages. Each page that is stored in or read from the buffer pool is assigned to one of the buffer pool instances randomly, using a hashing function. Each buffer pool manages its own free lists, flush lists, LRUs, and all other data structures connected to a buffer pool, and is protected by its own buffer pool mutex.This option takes effect only when you set the innodb_buffer_pool_size to a size of 1 gigabyte or more. The total size you specify is divided among all the buffer pools. For best efficiency, specify a combination ofinnodb_buffer_pool_instances and innodb_buffer_pool_size so that each buffer pool instance is at least 1 gigabyte.测试日期: Oct-2012测试目的: 测试 MySQL 5.6.7 的表现硬件换服务器: Dell PowerEdge R710CPU: 2x Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz内存: 192GB(这个内存太猛了)存储: Very Fast PCIe Flash Card文件系统: ext4软件操作系统: CentOS 6.3MySQL 版本: 5.6.7-RC测试规范测试工具: tpcc-mysql测试数据: 2500W (~250GB of data)测试时间: 总共测试 4000 秒,但只取最后的 2000 秒,避免因为冷启动的问题导致测试结果不准确不同的测试参数: 使用几组不同的 innodb_buffer_pool_size:13, 25, 50, 75, 100, 125GB ,innodb_buffer_pool_instances: 1 and 8, and innodb_log_file_size: 2x4GB and 2x8GB.2023-08-04 09:12:401
4399 可多选人物,有狐狸蓝色,还有粉色的,老游戏,英文
是不是还有只黑色的狐狸和松鼠?2023-08-04 09:13:076
[Spring boot源码解析] 2 启动流程分析
在了解 Spring Boot 的启动流程的时候,我们先看一下一个Spring Boot 应用是如何启动的,如下是一个简单的 SpringBoot 程序,非常的简洁,他是如何做到的呢,我们接下来就将一步步分解。 我们追踪 SpringApplication.run() 方法,其实最终它主要的逻辑是新建一个 SpringApplication ,然后调用他的 run 方法,如下: 我们先来看一下创建 SpringApplication 的方法: 在将Main class 设置 primarySources 后,调用了 WebApplicationType.deduceFromClasspath() 方法,该方法是为了检查当前的应用类型,并设置给 webApplicationType 。 我们进入 deduceFromClasspath 方法 : 这里主要是通过类加载器判断是否存在 REACTIVE 相关的类信息,假如有就代表是一个 REACTIVE 的应用,假如不是就检查是否存在 Servelt 和 ConfigurableWebApplicationContext ,假如都没有,就代表应用为非 WEB 类应用,返回 NONE ,默认返回 SERVLET 类型,我们这期以我们目前最常使用的 SERVLET 类型进行讲解,所以我们在应用中引入了 spring-boot-starter-web 作为依赖: 他会包含 Spring-mvc 的依赖,所以就包含了内嵌 tomcat 中的 Servlet 和 Spring-web 中的 ConfigurableWebApplicationContext ,因此返回了 SERVLET 类型。 回到刚才创建 SpringApplication 的构建方法中,我们设置完成应用类型后,就寻找所有的 Initializer 实现类,并设置到 SpringApplication 的 Initializers 中,这里先说一下 getSpringFactoriesInstances 方法,我们知道在我们使用 SpringBoot 程序中,会经常在 META-INF/spring.factories 目录下看到一些 EnableAutoConfiguration ,来出发 config 类注入到容器中,我们知道一般一个 config 类要想被 SpringBoot 扫描到需要使用 @CompnentScan 来扫描具体的路径,对于 jar 包来说这无疑是非常不方便的,所以 SpringBoot 提供了另外一种方式来实现,就是使用 spring.factories ,比如下面这个,我们从 Springboot-test 中找到的例子,这里先定义了一个ExampleAutoConfiguration,并加上了 Configuration 注解: 然后在 spring.factories 中定义如下: 那这种方式是怎么实现的你,这就要回到我们刚才的方法 getSpringFactoriesInstances : 我们先来看一下传入参数,这里需要注意的是 args,这个是初始化对应 type 的时候传入的构造参数,我们先看一下 SpringFactoriesLoader#loadFactoryNames 方法: 首先是会先检查缓存,假如缓存中存在就直接返回,假如没有就调用 classLoader#getResources 方法,传入 META-INF/spring.factories ,即获取所有 jar 包下的对应文件,并封装成 UrlResource ,然后使用 PropertiesLoaderUtils 将这些信息读取成一个对一对的 properties,我们观察一下 spring.factories 都是按 properties 格式排版的,假如有多个就用逗号隔开,所以这里还需要将逗号的多个类分隔开来,并加到 result 中,由于 result 是一个 LinkedMultiValueMap 类型,支持多个值插入,最后放回缓存中。最终完成加载 META-INF/spring.factories 中的配置,如下:我们可以看一下我们找到的 initializer 有多少个:在获取到所有的 Initializer 后接下来是调用 createSpringFactoriesInstances 方法进行初始化。 这里的 names 就是我们上面通过类加载器加载到的类名,到这里会先通过反射生成 class 对象,然后判断该类是否继承与 ApplicationContextInitializer ,最后通过发射的方式获取这个类的构造方法,并调用该构造方法,传入已经定义好的构造参数,对于 ApplicationContextInitializer 是无参的构造方法,然后初始化实例并返回,回到原来的方法,这里会先对所有的 ApplicationContextInitializer 进行排序,调用 AnnotationAwareOrderComparator#sort(instances) 方法,这里就是根据 @Order 中的顺序进行排序。 接下来是设置 ApplicationListener ,我们跟进去就会发现这里和上面获取 ApplicationContextInitializer 的方法如出一辙,最终会加载到如图的 15 个 listener (这里除了 EnableEncryptablePropertiesBeanFactoryPostProcessor 外,其他都是 SpringBoot 内部的 Listener):在完成 SpringApplication 对象的初始化后,我们进入了他的 run 方法,这个方法几乎涵盖了 SpringBoot 生命周期的所有内容,主要分为九个步骤,每一个步骤这里都使用注解进行标识: 主要步骤如下: 第一步:获取 SpringApplicationRunListener, 然后调用他的 staring 方法启动监听器。 第二步:根据 SpringApplicationRunListeners以及参数来准备环境。 第三步:创建 Spring 容器。 第四步:Spring 容器的前置处理。 第五步:刷新 Spring 容器。 第六步: Spring 容器的后置处理器。 第七步:通知所有 listener 结束启动。 第八步:调用所有 runner 的 run 方法。 第九步:通知所有 listener running 事件。 我们接下来一一讲解这些内容。 我们首先看一下第一步,获取 SpringApplicationRunListener : 这里和上面获取 initializer 和 listener 的方式基本一致,都是通过 getSpringFactoriesInstances , 最终只找到一个类就是: org.springframework.boot.context.event.EventPublishingRunListener ,然后调用其构造方法并传入产生 args , 和 SpringApplication 本身: 我们先看一下构造函数,首先将我们获取到的 ApplicationListener 集合添加到initialMulticaster 中, 最后都是通过操作 SimpleApplicationEventMulticaster 来进行广播,我,他继承于 AbstractApplicationEventMulticaster ,我们先看一下他的 addApplicationListener 方法: 我们可以看出,最后是放到了 applicationListenters 这个容器中。他是 defaultRetriever 的成员属性, defaultRetriever 则是 AbstractApplicationEventMulticaster 的私有类,我们简单看一下这个类: 我们只需要看一下这里的 getApplicationListeners 方法,它主要是到 beanFactory 中检查是否存在多的 ApplicationListener 和旧的 applicationListeners 组合并返回,接着执行 listener 的 start 方法,最后也是调用了 AbstractApplicationEventMulticaster 的 multicastEvent 查找支持对应的 ApplicationEvent 类型的通知的 ApplicationListener 的 onApplicationEvent 方法 ,这里除了会: 筛选的方法如下,都是调用了对应类型的 supportsEventType 方法 : 如图,我们可以看到对 org.springframework.boot.context.event.ApplicationStartingEvent 感兴趣的有5个 Listener 环境准备的具体方法如下: 首先是调用 getOrCreateEnvironment 方法来创建 environment ,我们跟进去可以发现这里是根据我们上面设置的环境的类型来进行选择的,当前环境会创建 StandardServletEnvironment 我们先来看一下 StandardServletEnvironment 的类继承关系图,我们可以看出他是继承了 AbstractEnvironment :他会调用子类的 customizePropertySources 方法实现,首先是 StandardServletEnvironment 的实现如下,他会添加 servletConfigInitParams , servletContextInitParams , jndiProperties 三种 properties,当前调试环境没有配置 jndi properties,所以这里不会添加。接着调用父类的 customizePropertySources 方法,即调用到了 StandardEnvironment 。 我们看一下 StandardEnvironment#customizePropertySources 方法,与上面的三个 properties 创建不同,这两个是会进行赋值的,包括系统环境变量放入 systemEnvironment 中,jvm 先关参数放到 systemProperties 中: 这里会添加 systemEnvironment 和 systemProperties 这两个 properties,最终拿到的 properties 数量如下 4个:在创建完成 Environment 后,接下来就到了调用 configureEnvironment 方法: 我们先看一下 configurePropertySources 方法,这里主要分两部分,首先是查询当前是否存在 defaultProperties ,假如不为空就会添加到 environment 的 propertySources 中,接着是处理命令行参数,将命令行参数作为一个 CompositePropertySource 或则 SimpleCommandLinePropertySource 添加到 environment 的 propertySources 里面, 接着调用 ConfigurationPropertySources#attach 方法,他会先去 environment 中查找 configurationProperties , 假如寻找到了,先检查 configurationProperties 和当前 environment 是否匹配,假如不相等,就先去除,最后添加 configurationProperties 并将其 sources 属性设置进去。 回到我们的 prepareEnvironment 逻辑,下一步是通知观察者,发送 ApplicationEnvironmentPreparedEvent 事件,调用的是 SpringApplicationRunListeners#environmentPrepared 方法,最终回到了 SimpleApplicationEventMulticaster#multicastEvent 方法,我们通过 debug 找到最后对这个时间感兴趣的 Listener 如下:其主要逻辑如下: 这个方法最后加载了 PropertySourceLoader , 这里主要是两种,一个是用于 Properties 的,一个是用于 YAML 的如下:其中 apply 方法主要是加载 defaultProperties ,假如已经存在,就进行替换,而替换的目标 PropertySource 就是 load 这里最后的一个 consumer 函数加载出来的,这里列一下主要做的事情: 1、加载系统中设置的所有的 Profile 。 2、遍历所有的 Profile ,假如是默认的 Profile , 就将这个 Profile 加到 environment 中。 3、调用load 方法,加载配置,我们深入看一下这个方法: 他会先调用 getSearchLocations 方法,加载所有的需要加载的路径,最终有如下路径:其核心方法是遍历所有的 propertySourceLoader ,也就是上面加载到两种 propertySourceLoader ,最红 loadForFileExtension 方法,加载配置文件,这里就不展开分析了,说一下主要的作用,因为每个 propertySourceLoader 都有自己可以加载的扩展名,默认扩展名有如下四个 properties, xml, yml, yaml,所以最终拿到文件名字,然后通过 - 拼接所有的真实的名字,然后加上路径一起加载。 接下来,我们分析 BackgroundPreinitializer ,这个方法在接收 ApplicationPrepareEnvironment 事件的时候真正调用了这份方法: 1、 ConversionServiceInitializer 主要负责将包括 日期,货币等一些默认的转换器注册到 formatterRegistry 中。 2、 ValidationInitializer 创建 validation 的匹配器。 3、 MessageConverterInitializer 主要是添加了一些 http 的 Message Converter。 4、 JacksonInitializer 主要用于生成 xml 转换器的。 接着回到我们将的主体方法, prepareEnvironment 在调用完成 listeners.environmentPrepared(environment) 方法后,调用 bindToSpringApplication(environment) 方法,将 environment 绑定到 SpirngApplication 中。 接着将 enviroment 转化为 StandardEnvironment 对象。 最后将 configurationProperties 加入到 enviroment 中, configurationProperties 其实是将 environment 中其他的 PropertySource 重新包装了一遍,并放到 environment 中,这里主要的作用是方便 PropertySourcesPropertyResolver 进行解析。 它主要是检查是否存在 spring.beaninfo.ignore 配置,这个配置的主要作用是设置 javaBean 的内省模式,所谓内省就是应用程序在 Runtime 的时候能检查对象类型的能力,通常也可以称作运行时类型检查,区别于反射主要用于修改类属性,内省主要用户获取类属性。那么我们什么时候会使用到内省呢,java主要是通过内省工具 Introspector 来完成内省的工作,内省的结果通过一个 Beaninfo 对象返回,主要包括类的一些相关信息,而在 Spring中,主要是 BeanUtils#copyProperties 会使用到,Spring 对内省机制还进行了改进,有三种内省模式,如下图中红色框框的内容,默认情况下是使用 USE_ALL_BEANINFO。假如设置为true,就是改成第三中 IGNORE_ALL_BEANINFO首先是检查 Application的类型,然后获取对应的 ApplicationContext 类,我们这里是获取到了 org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext 接着调用 BeanUtils.instantiateClass(contextClass); 方法进行对象的初始化。 最终其实是调用了 AnnotationConfigServletWebServerApplicationContext 的默认构造方法。我们看一下这个方法做了什么事情。这里只是简单的设置了一个 reader 和一个 scanner,作用于 bean 的扫描工作。 我们再来看一下这个类的继承关系这里获取 ExceptionReporter 的方式主要还是和之前 Listener 的方式一致,通过 getSpringFactoriesInstances 来获取所有的 SpringBootExceptionReporter 。 其主要方法执行如下:2023-08-04 09:13:231
帮忙翻译
管理和维护操作。这个应用程序有超过200个存储程序/数据库支持网络服务。 这个非传统的设计带来了新的挑战,系统管理和调整为SQL服务器。最大的挑战是数量的内存需求支持大量的存储过程,乘以这个数目的数据库。对于SQL服务器、虚拟内存空间是必需的,以便执行计划可以编制每道工序在每个数据库,这个方案被保存在一个程序缓存。应用的步伐,执行计划为500数据库缓存是200 * 500(或100,000缓存条目)。大数量的速度越大,所需的数据库服务器程序缓存的大小。当有更多的执行计划的程序缓存能保持在记忆、执行recompilations发生,从而减少query-processing吞吐量。传统的方法,如化的存储过程,并没有解决这个问题。 调音需要特别有效配置增加有效内存空间的程序缓存。其他的挑战,包括如何有效利用cpu的高度的并发活动由于数据库和用户的数量,优化磁盘布局、优化回收模式。 使用多重副本 多个实例可以规模的数据库和工作量每台服务器 当这个数目的数据库和工作量达到一定的水平,这是一种很好的实践群体在多个SQL数据库实例为它能减轻压力对记忆。良好的表现是由能够使用更多的内存缓存服务器程序为每个实例,并为您提供更好的操作和安全隔离。 我们的测试表明,采用多尺度上允许总人数的数据库和在系统工作量,保持良好的数据库。 图1显示性能下降时,在一个单独的实例的数量增长速度从500到4000数据库。它还显示运行中的每500数据库实例给出了八8次每分钟的交易上跑步500数据库实例。500数据库,每跑的例子,以8繁重的工作已接近CPU能力利用总在这个硬件配置,所以进一步增加2023-08-04 09:13:343
新编实用英语 第二版 综合教程2 6, 7, 8单元的答案412612046@qq.com
这题适合做高质量题吗?2023-08-04 09:13:512
枚举中的instance表示什么意思
instance英 [u02c8u026anstu0259ns] 美 [u02c8u026anstu0259ns] n.情况;例子,实例;要求,建议;[法]诉讼手续vt.举…为例第三人称单数: instances 复数: instances 现在分词: instancing 过去式: instanced 过去分词: instanced双语例句 There are a number of improvements; for instance, both mouse buttons can now be used 在许多地方有了改进,例如,鼠标的左右键都可以使用了。2023-08-04 09:14:251
instance是抽象名词吗
为毛不去英语吧啊?2023-08-04 09:14:332
如何查看和获取SQL Server实例名
在服务里,找到sqlserver的服务,服务后面跟着一个括号,括号里就是实例名。比如服务名是sqlserver(mssqlserver),则mssqlserver就是实例名。2023-08-04 09:14:403
探讨:如何查看和获取SQLServer实例名
一、查看_例名_可用1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)或在连接企业管理时-查看本地实例2、通_注_表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance3、用命令sqlcmd/osqlsqlcmd -Lsqlcmd -Lcosql -L获取可用_例,以下_一_例子,根_自己情_改 代码如下:DECLARE @Table TABLE ( instanceName sysname NULL)insert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代_本_名就行了 , 根__例命名__判_SELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"二、--1. SELECT SERVERPROPERTY("InstanceName") --2sp_helpserver --3select @@SERVERNAME--4SELECT * FROM SYS.SYSSERVERS--5SELECT * FROM SYS.SERVERS 三、EXECUTE xp_regread @rootkey="HKEY_LOCAL_MACHINE",@key="SOFTWARE/Microsoft/Microsoft SQL Server/Instance Names/SQl",@value_name="MSSQLSERVER"四、Select CaseWhen SERVERPROPERTY ("InstanceName") Is Null Then @@SERVERNAMEElse SERVERPROPERTY ("InstanceName")End五、在本地或网络得到所有实例名1、You can do with registry reading , like my code 代码如下:using System;using Microsoft.Win32;namespace SMOTest{ class Program { static void Main() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Microsoft SQL Server"); String[] instances = (String[])rk.GetValue("InstalledInstances"); if (instances.Length > 0) { foreach (String element in instances) { if (element == "MSSQLSERVER") Console.WriteLine(System.Environment.MachineName); else Console.WriteLine(System.Environment.MachineName + @"/" + element); } } } }}2、You can use SQLDMO.dll to retrieve the list of SQL Server instances. The SQLDMO.dll can be found from the "C:/Program Files/Microsoft SQL Server/80/Tools/Bin" folder. Refer this assembly in your project and the following snippet would return a List Object containing the sql server instances. 代码如下:public static List GetSQLServerInstances() {NameList sqlNameList = null;Application app = null;var sqlServers = new List();try {app = new ApplicationClass();sqlNameList = app.ListAvailableSQLServers();foreach (string sqlServer in sqlNameList)sqlServers.Add(sqlServer);}catch(Exception ex){//play with the exception.} finally {if (sqlNameList != null)sqlNameList = null;if (app != null)app = null;}return sqlServers;}2023-08-04 09:14:481
C# 如何获取SQL实例名(已安装的所有实例名)
不知道,学习一下2023-08-04 09:14:582
怎么查看和获取SQL Server实例名
查看实例名时可用1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)或在连接企业管理时-查看本地实例 2、通过注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance3、用命令sqlcmd/osqlsqlcmd -Lsqlcmd -Lcosql -L获取可用实例,以下举一个例子,根据自己情况改DECLARE @Table TABLE ( instanceName sysname NULL)insert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代为本机名就行了 , 根据实例命名规则判断SELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"2023-08-04 09:15:052
怎么查看sql server 数据库的实例名
查看实例名时可用 1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)或在连接企业管理时-查看本地实例2、通过注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance3、用命令sqlcmd/osql sqlcmd -L sqlcmd -Lc osql -L获取可用实例,以下举一个例子,根据自己情况改DECLARE @Table TABLE ( instanceName sysname NULL)insert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代为本机名就行了 , 根据实例命名规则判断SELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"二、--1. SELECT SERVERPROPERTY("InstanceName") --2 sp_helpserver --3 select @@SERVERNAME--4 SELECT * FROM SYS.SYSSERVERS--5 SELECT * FROM SYS.SERVERS 三、EXECUTE xp_regread @rootkey="HKEY_LOCAL_MACHINE", @key="SOFTWARE/Microsoft/Microsoft SQL Server/Instance Names/SQl", @value_name="MSSQLSERVER"四、Select Case When SERVERPROPERTY ("InstanceName") Is Null Then @@SERVERNAME Else SERVERPROPERTY ("InstanceName") End五、在本地或网络得到所有实例名1、You can do with registry reading , like my codeusing System; using Microsoft.Win32;namespace SMOTest { class Program { static void Main() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Microsoft SQL Server"); String[] instances = (String[])rk.GetValue("InstalledInstances"); if (instances.Length > 0) { foreach (String element in instances) { if (element == "MSSQLSERVER") Console.WriteLine(System.Environment.MachineName); else Console.WriteLine(System.Environment.MachineName + @"/" + element); } } } } }2、You can use SQLDMO.dll to retrieve the list of SQL Server instances. The SQLDMO.dll can be found from the "C:/Program Files/Microsoft SQL Server/80/Tools/Bin"folder. Refer this assembly in your project and the following snippet would return a List Object containing the sql server instances.public static List GetSQLServerInstances(){NameList sqlNameList = null;Application app = null;var sqlServers = new List();try{app = new ApplicationClass();sqlNameList = app.ListAvailableSQLServers();foreach (string sqlServer in sqlNameList)sqlServers.Add(sqlServer);}catch(Exception ex){//play with the exception.}finally{if (sqlNameList != null)sqlNameList = null;if (app != null)app = null;}return sqlServers;}2023-08-04 09:15:151
怎么查看本机已经安装的sqlserver的所有实例名
1.又键单击“我的电脑(windows XP)”或“计算机(Windows 7)”查看本机的计算机名。2.打开“SQL Server 2008”,服务器类型选择:数据库引擎。服务器名称写上:计算机名安装SQL Server时自己创建的实例名。身份验证选择:SQL Server 身份验证。填上自己设置的登录名和密码。3.点击“连接”就可以登录了此时,SQL Server 2008登录出错的问题就解决了。总结:SQL Server 2008 版本数据库软件的服务器名称较SQL Server 2005版本做了改变,现在使用的是:计算机名实例名。这就导致了“无法连接到(local)”的问题。2023-08-04 09:15:222
如何查看本机已经安装的“sqlserver”的所有实例名?
您好,很高兴能帮助您,x0dx0a来源于csdnx0dx0a一、x0dx0ax0dx0a查看实例名时可用x0dx0a1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)x0dx0ax0dx0a或在连接企业管理时-查看本地实例x0dx0ax0dx0a2、通过注册表x0dx0aHKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstancex0dx0ax0dx0a3、用命令x0dx0ax0dx0asqlcmd/osqlx0dx0asqlcmd -Lx0dx0asqlcmd -Lcx0dx0aosql -Lx0dx0ax0dx0a获取可用实例,以下举一个例子,根据自己情况改x0dx0ax0dx0aDECLARE @Table TABLE ( instanceName sysname NULL)x0dx0ax0dx0ainsert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"x0dx0ax0dx0a--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代为本机名就行了 , 根据实例命名规则判断x0dx0ax0dx0aSELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"x0dx0ax0dx0a二、x0dx0ax0dx0a--1.x0dx0aSELECT SERVERPROPERTY("InstanceName")x0dx0ax0dx0a--2x0dx0asp_helpserverx0dx0ax0dx0a--3x0dx0aselect @@SERVERNAMEx0dx0ax0dx0a--4x0dx0aSELECT * FROM SYS.SYSSERVERSx0dx0ax0dx0a--5x0dx0aSELECT * FROM SYS.SERVERSx0dx0ax0dx0a三、x0dx0ax0dx0aEXECUTE xp_regread @rootkey="HKEY_LOCAL_MACHINE",x0dx0a@key="SOFTWARE/Microsoft/Microsoft SQL Server/Instance Names/SQl",x0dx0a@value_name="MSSQLSERVER"x0dx0ax0dx0a四、x0dx0ax0dx0aSelect Casex0dx0aWhen SERVERPROPERTY ("InstanceName") Is Null Then @@SERVERNAMEx0dx0aElse SERVERPROPERTY ("InstanceName")x0dx0aEndx0dx0ax0dx0a五、在本地或网络得到所有实例名x0dx0ax0dx0a1、You can do with registry reading , like my codex0dx0ax0dx0ausing System;x0dx0ausing Microsoft.Win32;x0dx0ax0dx0anamespace SMOTestx0dx0a{x0dx0a class Programx0dx0a {x0dx0a static void Main()x0dx0a {x0dx0a RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Microsoft SQL Server");x0dx0a String[] instances = (String[])rk.GetValue("InstalledInstances");x0dx0a if (instances.Length > 0)x0dx0a {x0dx0a foreach (String element in instances)x0dx0a {x0dx0a if (element == "MSSQLSERVER")x0dx0a Console.WriteLine(System.Environment.MachineName);x0dx0a elsex0dx0a Console.WriteLine(System.Environment.MachineName + @"/" + element);x0dx0a }x0dx0a }x0dx0a }x0dx0a }x0dx0a}x0dx0ax0dx0a2、You can use SQLDMO.dll to retrieve the list of SQL Server instances. The SQLDMO.dll can be found from the "C:/Program Files/Microsoft SQL Server/80/Tools/Bin" folder. Refer this assembly in your project and the following snippet would return a List Object containing the sql server instances.x0dx0ax0dx0apublic static List GetSQLServerInstances() x0dx0a{x0dx0aNameList sqlNameList = null;x0dx0aApplication app = null;x0dx0ax0dx0avar sqlServers = new List();x0dx0atry x0dx0a{x0dx0aapp = new ApplicationClass();x0dx0asqlNameList = app.ListAvailableSQLServers();x0dx0aforeach (string sqlServer in sqlNameList)x0dx0asqlServers.Add(sqlServer);x0dx0a}x0dx0acatch(Exception ex)x0dx0a{x0dx0a//play with the exception.x0dx0a} x0dx0afinally x0dx0a{x0dx0aif (sqlNameList != null)x0dx0asqlNameList = null;x0dx0aif (app != null)x0dx0aapp = null;x0dx0a}x0dx0areturn sqlServers;x0dx0a}x0dx0a你的采纳是我前进的动力,还有不懂的地方,请你继续“追问”!x0dx0a如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助!2023-08-04 09:15:321
怎么查看sql server 数据库的实例名
一、查看实例名时可用 1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)或在连接企业管理时-查看本地实例2、通过注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance3、用命令sqlcmd/osql sqlcmd -L sqlcmd -Lc osql -L获取可用实例,以下举一个例子,根据自己情况改DECLARE @Table TABLE ( instanceName sysname NULL)insert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代为本机名就行了 , 根据实例命名规则判断SELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"二、--1. SELECT SERVERPROPERTY("InstanceName") --2 sp_helpserver --3 select @@SERVERNAME--4 SELECT * FROM SYS.SYSSERVERS--5 SELECT * FROM SYS.SERVERS 三、EXECUTE xp_regread @rootkey="HKEY_LOCAL_MACHINE", @key="SOFTWARE/Microsoft/Microsoft SQL Server/Instance Names/SQl", @value_name="MSSQLSERVER"四、Select Case When SERVERPROPERTY ("InstanceName") Is Null Then @@SERVERNAME Else SERVERPROPERTY ("InstanceName") End五、在本地或网络得到所有实例名1、You can do with registry reading , like my codeusing System; using Microsoft.Win32;namespace SMOTest { class Program { static void Main() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Microsoft SQL Server"); String[] instances = (String[])rk.GetValue("InstalledInstances"); if (instances.Length > 0) { foreach (String element in instances) { if (element == "MSSQLSERVER") Console.WriteLine(System.Environment.MachineName); else Console.WriteLine(System.Environment.MachineName + @"/" + element); } } } } }2、You can use SQLDMO.dll to retrieve the list of SQL Server instances. The SQLDMO.dll can be found from the "C:/Program Files/Microsoft SQL Server/80/Tools/Bin" folder. Refer this assembly in your project and the following snippet would return a List Object containing the sql server instances.public static List GetSQLServerInstances(){NameList sqlNameList = null;Application app = null;var sqlServers = new List();try{app = new ApplicationClass();sqlNameList = app.ListAvailableSQLServers();foreach (string sqlServer in sqlNameList)sqlServers.Add(sqlServer);}catch(Exception ex){//play with the exception.}finally{if (sqlNameList != null)sqlNameList = null;if (app != null)app = null;}return sqlServers;}2023-08-04 09:15:521
abaqus中出现,Dependent part instances connot be edited ,怎么办?如何设置
你就用part的方式编辑就可以了2023-08-04 09:16:003
如何查看本机已经安装的“sqlserver”的所有实例名?
您好,很高兴能帮助您,来源于csdn一、查看实例名时可用1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER)或在连接企业管理时-查看本地实例2、通过注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance3、用命令sqlcmd/osqlsqlcmd -Lsqlcmd -Lcosql -L获取可用实例,以下举一个例子,根据自己情况改DECLARE @Table TABLE ( instanceName sysname NULL)insert @Table EXEC sys.xp_cmdshell "sqlcmd -Lc"--LEFT(@@serverName,CHARINDEX("/",@@serverName+"/")-1) 替代为本机名就行了 , 根据实例命名规则判断SELECT * FROM @Table WHERE instanceName LIKE LEFT( @@serverName , CHARINDEX ( "/" , @@serverName + "/" )- 1)+ "%"二、--1.SELECT SERVERPROPERTY("InstanceName")--2sp_helpserver--3select @@SERVERNAME--4SELECT * FROM SYS.SYSSERVERS--5SELECT * FROM SYS.SERVERS三、EXECUTE xp_regread @rootkey="HKEY_LOCAL_MACHINE",@key="SOFTWARE/Microsoft/Microsoft SQL Server/Instance Names/SQl",@value_name="MSSQLSERVER"四、Select CaseWhen SERVERPROPERTY ("InstanceName") Is Null Then @@SERVERNAMEElse SERVERPROPERTY ("InstanceName")End五、在本地或网络得到所有实例名1、You can do with registry reading , like my codeusing System;using Microsoft.Win32;namespace SMOTest{ class Program { static void Main() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Microsoft SQL Server"); String[] instances = (String[])rk.GetValue("InstalledInstances"); if (instances.Length > 0) { foreach (String element in instances) { if (element == "MSSQLSERVER") Console.WriteLine(System.Environment.MachineName); else Console.WriteLine(System.Environment.MachineName + @"/" + element); } } } }}2、You can use SQLDMO.dll to retrieve the list of SQL Server instances. The SQLDMO.dll can be found from the "C:/Program Files/Microsoft SQL Server/80/Tools/Bin" folder. Refer this assembly in your project and the following snippet would return a List Object containing the sql server instances.public static List GetSQLServerInstances() {NameList sqlNameList = null;Application app = null;var sqlServers = new List();try {app = new ApplicationClass();sqlNameList = app.ListAvailableSQLServers();foreach (string sqlServer in sqlNameList)sqlServers.Add(sqlServer);}catch(Exception ex){//play with the exception.} finally {if (sqlNameList != null)sqlNameList = null;if (app != null)app = null;}return sqlServers;}你的采纳是我前进的动力,还有不懂的地方,请你继续“追问”!如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助!2023-08-04 09:16:101
cadence原理图中,保存时提示has unbound instances是什么意思?
有未绑定元件或其他。2023-08-04 09:16:171
time instances什么意思
百度的翻译是 时间实例,额......你确定是这个短语组合吗?2023-08-04 09:16:253
如何检测innodb buffer pool size是否够用
摘要:1 innodb_buffer_pool_instances可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。 2 innodb_buffer_pool_instances 参数显著的影响测试结果,特别是非常高的 I/O 负载时。2023-08-04 09:16:331
oracle数据库登陆不进去 提示all appropriate instances are blocking new connec
应该是监听器没有启动,你启动下试试2023-08-04 09:16:562
Too many open files的四种解决办法
一 单个进程打开文件句柄数过多 二 操作系统打开的文件句柄数过多 三 systemd对该进程进行了限制 四 inotify达到上限. ulimit中的nofile表示单进程可以打开的最大文件句柄数,可以通过ulimit -a查看,子进程默认继承父进程的限制(注意,是继承,不是共享,子进程和父进程打开的文件句柄数是单独算的)。 网上还有一种解读是nofile表示单用户可以打开的文件句柄数,因为他们在limit.conf中看到类似于“openstack soft nofile 65536”,便认为是openstack用户最多可以打开的文件句柄数。该解读是错误的,“openstack soft nofile 65536”表示的含义是当你执行"su - openstack"切换到openstack用户后,你创建的所有进程最大可以打开的文件句柄数是65536。 要查看一个进程可以打开的文件句柄数,可以通过“cat /proc/<pid>/limits”查看。 要修改ulimit中的nofile,可以通过修改/etc/security/limits.conf文件,在其中加入类似“openstack soft nofile 65536”的语句来进行修改。修改完成后,可以通过“su - openstack”切换用户,或者重新登录,来使该配置生效。 要动态修改一个进程的限制,可以使用prlimit命令,具体用法为:“prlimit --pid ${pid} --nofile=102400:102400”。 整个操作系统可以打开的文件句柄数是有限的,受内核参数“fs.file-max”影响。 可以通过执行“echo 100000000 > /proc/sys/fs/file-max”命令来动态修改该值,也可以通过修改"/etc/sysctl.conf"文件来永久修改该值。 该场景仅针对被systemd管理的进程(也就是可以通过systemctl来控制的进程)生效,可以通过修改该进程的service文件(通常在/etc/systemd/system/目录下),在“[Service]”下面添加“LimitNOFILE=20480000”来实现,修改完成之后需要执行"systemctl daemon-reload"来使该配置生效。 inotify是linux提供的一种监控机制,可以监控文件系统的变化。该机制受到2个内核参数的影响:“fs.inotify.max_user_instances”和“fs.inotify.max_user_watches”,其中“fs.inotify.max_user_instances”表示每个用户最多可以创建的inotify instances数量上限,“fs.inotify.max_user_watches”表示么个用户同时可以添加的watch数目,当出现too many open files问题而上面三种方法都无法解决时,可以尝试通过修改这2个内核参数来生效。修改方法是修改"/etc/sysctl.conf"文件,并执行"sysctl -p"。 原文地址: https://www.cnblogs.com/huaweicloud/p/11861475.html2023-08-04 09:17:041
abaqus里create instance中的auto-offset from other instances是什么意思
指的是采用从其他instance拷贝的方式建立新instance的方法2023-08-04 09:17:111
电脑更换新纽扣电池后,电脑关机出现蓝屏,提示出现问题:STOP:0X0000000A
BiOSS没有设置好吧。2023-08-04 09:17:324
No instances available for goods 什么意思?
商品无实例。instance 例子 goods 货物,商品2023-08-04 09:18:331
java类内多个函数如何同步
楼上正解,试试吧2023-08-04 09:18:447
凉凉的歌词歌曲带歌词
命令集主要分成三方面:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。 自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh...... 这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。 windows脚本很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。 1,显示系统版本 @echo for each ps in getobject _ >ps.vbs @echo ("winmgmts://./root/cimv2:win32_operatingsystem").instances_ >>ps.vbs @echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs cscript //nologo ps.vbs & del ps.vbs 2,列举进程 @echo for each ps in getobject _ >ps.vbs @echo ("winmgmts://./root/cimv2:win32_process").instances_ >>ps.vbs @echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs cscript //nologo ps.vbs & del ps.vbs 3,终止进程 @echo for each ps in getobject _ >pk.vbs @echo ("winmgmts://./root/cimv2:win32_process").instances_ >>pk.vbs @echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs 要终止PID为123的进程,使用如下语法: cscript pk.vbs 123 如果显示一个0,表示终止成功。 然后: del pk.vbs 4,重启系统 @echo for each os in getobject _ >rb.vbs @echo ("winmgmts:{(shutdown)}!//./root/cimv2:win32_operatingsystem").instances_ >>rb.vbs @echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs 5,列举自启动的服务 @echo for each sc in getobject("winmgmts://./root/cimv2:win32_service").instances_ >sc.vbs @echo if sc.startmode="Auto" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs @echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs 6,列举正在运行的服务 @echo for each sc in getobject("winmgmts://./root/cimv2:win32_service").instances_ >sc.vbs @echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs @echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs 7,显示系统最后一次启动的时间 @echo for each os in getobject _ >bt.vbs @echo ("winmgmts://./root/cimv2:win32_operatingsystem").instances_ >>bt.vbs @echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs netsh 在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ftp -s:filename。netsh也是这样:netsh -f filename。 netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。 1,TCP/IP配置 echo interface ip >s echo show config >>s netsh -f s del s 由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。 电脑知识 这个命令和ipconfig /all差不多。 注意,以下命令需要目标主机启动remoteaccess服务。如果它被禁用,请先通过导入注册表解禁,然后 net start remoteaccess 2,ARP echo interface ip >s echo show ipnet >>s netsh -f s del s 这个比arp -a命令多一点信息。 3,TCP/UDP连接 echo interface ip >s echo show tcpconn >>s echo show udpconn >>s netsh -f s del s 这组命令和netstat -an一样。 4,网卡信息 如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。 echo interface ip >s echo show interface >>s netsh -f s del s netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就"叫天不应叫地不灵"了),所以全部略过。 IPSec 首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。所以要学好网络方面的知识,这些命令是必学的。2023-08-04 09:19:023
电脑运行是突然蓝屏启动第一次还是蓝屏!!!这是怎么回事!请高手赐教一下啊!!!
你好!出现蓝屏或死机的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等。建议:1、先把BIOS恢复出厂状态试试; 2、系统是否有病毒,建议安全模式下扫描杀毒; 3、重装系统后硬件的驱动程序是否安装成功? 4、最好先重装操作系统; 5、如重装系统后仍有问题,则极可能是硬件不兼容所致; 6、向商家或周围熟悉电脑的朋友咨询一下也好,或许他们会给予帮助; 7、祝你好运!另外,特别建议:1、把显卡和内存拔出来用橡皮擦干净,清理插槽,再将显卡和内存插紧;换掉不兼容和有问题的内存。 2、更新显卡驱动,降低分辨率、颜色质量、刷新率;降低硬件加速-桌面属性-设置-高级-疑难解答-将“硬件加速”降到“无”,必要时换个档次高一点的显卡。 3、检查硬件剩余空间,一般而言,装有系统的C盘最低应保证1GB以上的空间,把虚拟内存从C盘移到磁盘空间比较大的分区。 4、硬盘的碎片太多,也容易导致蓝屏出现,每隔一段时间,要对磁盘进行一次碎片整理。 5、电源电压不稳,电源功率不足,更换质量高的功率大的电源。2023-08-04 09:19:133
MySQL性能调优 – 你必须了解的15个重要变量
前言: MYSQL 应该是最流行了 WEB 后端数据库。虽然 NOSQL 最近越来越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。本文作者总结梳理MySQL性能调优的15个重要变量,又不足需要补充的还望大佬指出。 1.DEFAULT_STORAGE_ENGINE 如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了。如果没有,确保把你的表转换为InnoDB并且设置default_storage_engine为InnoDB。 为什么?简而言之,因为InnoDB是MySQL(包括Percona Server和MariaDB)最好的存储引擎 – 它支持事务,高并发,有着非常好的性能表现(当配置正确时)。这里有详细的版本介绍为什么 2.INNODB_BUFFER_POOL_SIZE 这个是InnoDB最重要变量。实际上,如果你的主要存储引擎是InnoDB,那么对于你,这个变量对于MySQL是最重要的。 基本上,innodb_buffer_pool_size指定了MySQL应该分配给InnoDB缓冲池多少内存,InnoDB缓冲池用来存储缓存的数据,二级索引,脏数据(已经被更改但没有刷新到硬盘的数据)以及各种内部结构如自适应哈希索引。 根据经验,在一个独立的MySQL服务器应该分配给MySQL整个机器总内存的80%。如果你的MySQL运行在一个共享服务器,或者你想知道InnoDB缓冲池大小是否正确设置,详细请看这里。 3.INNODB_LOG_FILE_SIZE InnoDB重做日志文件的设置在MySQL社区也叫做事务日志。直到MySQL 5.6.8事务日志默认值innodb_log_file_size=5M是唯一最大的InnoDB性能杀手。从MySQL 5.6.8开始,默认值提升到48M,但对于许多稍繁忙的系统,还远远要低。 根据经验,你应该设置的日志大小能在你服务器繁忙时能存储1-2小时的写入量。如果不想这么麻烦,那么设置1-2G的大小会让你的性能有一个不错的表现。这个变量也相当重要,更详细的介绍请看这里。 当然,如果你有大量的大事务更改,那么,更改比默认innodb日志缓冲大小更大的值会对你的性能有一定的提高,但是你使用的是autocommit,或者你的事务更改小于几k,那还是保持默认的值吧。 4.INNODB_FLUSH_LOG_AT_TRX_COMMIT 默认下,innodb_flush_log_at_trx_commit设置为1表示InnoDB在每次事务提交后立即刷新同步数据到硬盘。如果你使用autocommit,那么你的每一个INSERT, UPDATE或DELETE语句都是一个事务提交。 同步是一个昂贵的操作(特别是当你没有写回缓存时),因为它涉及对硬盘的实际同步物理写入。所以如果可能,并不建议使用默认值。 两个可选的值是0和2: * 0表示刷新到硬盘,但不同步(提交事务时没有实际的IO操作) * 2表示不刷新和不同步(也没有实际的IO操作) 所以你如果设置它为0或2,则同步操作每秒执行一次。所以明显的缺点是你可能会丢失上一秒的提交数据。具体来说,你的事务已经提交了,但服务器马上断电了,那么你的提交相当于没有发生过。 显示的,对于金融机构,如银行,这是无法忍受的。不过对于大多数网站,可以设置为innodb_flush_log_at_trx_commit=0|2,即使服务器最终崩溃也没有什么大问题。毕竟,仅仅在几年前有许多网站还是用MyISAM,当崩溃时会丢失30s的数据(更不要提那令人抓狂的慢修复进程)。 那么,0和2之间的实际区别是什么?性能明显的差异是可以忽略不计,因为刷新到操作系统缓存的操作是非常快的。所以很明显应该设置为0,万一MySQL崩溃(不是整个机器),你不会丢失任何数据,因为数据已经在OS缓存,最终还是会同步到硬盘的。 5.SYNC_BINLOG 已经有大量的文档写到sync_binlog,以及它和innodb_flush_log_at_trx_commit的关系,下面我们来简单的介绍下: a) 如果你的服务器没有设置从服务器,而且你不做备份,那么设置sync_binlog=0将对性能有好处。 b) 如果你有从服务器并且做备份,但你不介意当主服务器崩溃时在二进制日志丢失一些事件,那么为了更好的性能还是设置为sync_binlog=0. c) 如果你有从服务器并且备份,你非常在意从服务器的一致性,以及能及时恢复到一个时间点(通过使用最新的一致性备份和二进制日志将数据库恢复到特定时间点的能力),那么你应该设置innodb_flush_log_at_trx_commit=1,并且需要认真考虑使用sync_binlog=1。 问题是sync_binlog=1代价比较高 – 现在每个事务也要同步一次到硬盘。你可能会想为什么不把两次同步合并成一次,想法正确 – 新版本的MySQL(5.6和5.7,MariaDB和Percona Server)已经能合并提交,那么在这种情况下sync_binlog=1的操作也不是这么昂贵了,但在旧的mysql版本中仍然会对性能有很大影响。 6.INNODB_FLUSH_METHOD 将innodb_flush_method设置为O_DIRECT以避免双重缓冲.唯一一种情况你不应该使用O_DIRECT是当你操作系统不支持时。但如果你运行的是Linux,使用O_DIRECT来激活直接IO。 不用直接IO,双重缓冲将会发生,因为所有的数据库更改首先会写入到OS缓存然后才同步到硬盘 – 所以InnoDB缓冲池和OS缓存会同时持有一份相同的数据。特别是如果你的缓冲池限制为总内存的50%,那意味着在写密集的环境中你可能会浪费高达50%的内存。如果没有限制为50%,服务器可能由于OS缓存的高压力会使用到swap。 简单地说,设置为innodb_flush_method=O_DIRECT。 7.INNODB_BUFFER_POOL_INSTANCES MySQL 5.5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段。 在5.5版本这个对提升吞吐量帮助很小,然后在MySQL 5.6版本这个提升就非常大了,所以在MySQL5.5中你可能会保守地设置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以设置为8-16个缓冲池实例。 你设置后观察会觉得性能提高不大,但在大多数高负载情况下,它应该会有不错的表现。 对了,不要指望这个设置能减少你单个查询的响应时间。这个是在高并发负载的服务器上才看得出区别。比如多个线程同时做许多事情。 8.INNODB_THREAD_CONCURRENCY InnoDB有一种方法来控制并行执行的线程数 – 我们称为并发控制机制。大部分是由innodb_thread_concurrency值来控制的。如果设置为0,并发控制就关闭了,因此InnoDB会立即处理所有进来的请求(尽可能多的)。 在你有32CPU核心且只有4个请求时会没什么问题。不过想像下你只有4CPU核心和32个请求时 – 如果你让32个请求同时处理,你这个自找麻烦。因为这些32个请求只有4 CPU核心,显然地会比平常慢至少8倍(实际上是大于8倍),而然这些请求每个都有自己的外部和内部锁,这有很大可能堆积请求。 下面介绍如何更改这个变量,在mysql命令行提示符执行: 对于大多数工作负载和服务器,设置为8是一个好开端,然后你可以根据服务器达到了这个限制而资源使用率利用不足时逐渐增加。可以通过show engine innodb statusG来查看目前查询处理情况,查找类似如下行: 9.SKIP_NAME_RESOLVE 这一项不得不提及,因为仍然有很多人没有添加这一项。你应该添加skip_name_resolve来避免连接时DNS解析。 大多数情况下你更改这个会没有什么感觉,因为大多数情况下DNS服务器解析会非常快。不过当DNS服务器失败时,它会出现在你服务器上出现“unauthenticated connections” ,而就是为什么所有的请求都突然开始慢下来了。 所以不要等到这种事情发生才更改。现在添加这个变量并且避免基于主机名的授权。 10.INNODB_IO_CAPACITY, INNODB_IO_CAPACITY_MAX * innodb_io_capacity:用来当刷新脏数据时,控制MySQL每秒执行的写IO量。 * innodb_io_capacity_max: 在压力下,控制当刷新脏数据时MySQL每秒执行的写IO量 首先,这与读取无关 – SELECT查询执行的操作。对于读操作,MySQL会尽最大可能处理并返回结果。至于写操作,MySQL在后台会循环刷新,在每一个循环会检查有多少数据需要刷新,并且不会用超过innodb_io_capacity指定的数来做刷新操作。这也包括更改缓冲区合并(在它们刷新到磁盘之前,更改缓冲区是辅助脏页存储的关键)。 第二,我需要解释一下什么叫“在压力下”,MySQL中称为”紧急情况”,是当MySQL在后台刷新时,它需要刷新一些数据为了让新的写操作进来。然后,MySQL会用到innodb_io_capacity_max。 那么,应该设置innodb_io_capacity和innodb_io_capacity_max为什么呢? 最好的方法是测量你的存储设置的随机写吞吐量,然后给innodb_io_capacity_max设置为你的设备能达到的最大IOPS。innodb_io_capacity就设置为它的50-75%,特别是你的系统主要是写操作时。 通常你可以预测你的系统的IOPS是多少。例如由8 15k硬盘组成的RAID10能做大约每秒1000随机写操作,所以你可以设置innodb_io_capacity=600和innodb_io_capacity_max=1000。许多廉价企业SSD可以做4,000-10,000 IOPS等。 这个值设置得不完美问题不大。但是,要注意默认的200和400会限制你的写吞吐量,因此你可能偶尔会捕捉到刷新进程。如果出现这种情况,可能是已经达到你硬盘的写IO吞吐量,或者这个值设置得太小限制了吞吐量。 11.INNODB_STATS_ON_METADATA 如果你跑的是MySQL 5.6或5.7,你不需要更改innodb_stats_on_metadata的默认值,因为它已经设置正确了。 不过在MySQL 5.5或5.1,强烈建议关闭这个变量 – 如果是开启,像命令show table status会立即查询INFORMATION_SCHEMA而不是等几秒再执行,这会使用到额外的IO操作。 从5.1.32版本开始,这个是动态变量,意味着你不需要重启MySQL服务器来关闭它。 12.INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN & INNODB_BUFFER_POOL_LOAD_AT_STARTUP innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup这两个变量与性能无关,不过如果你偶尔重启mysql服务器(如生效配置),那么就有关。当两个都激活时,MySQL缓冲池的内容(更具体地说,是缓存页)在停止MySQL时存储到一个文件。当你下次启动MySQL时,它会在后台启动一个线程来加载缓冲池的内容以提高预热速度到3-5倍。 两件事: 第一,它实际上没有在关闭时复制缓冲池内容到文件,仅仅是复制表空间ID和页面ID – 足够的信息来定位硬盘上的页面了。然后它就能以大量的顺序读非常快速的加载那些页面,而不是需要成千上万的小随机读。 第二,启动时是在后台加载内容,因为MySQL不需要等到缓冲池内容加载完成再开始接受请求(所以看起来不会有什么影响)。 从MySQL 5.7.7开始,默认只有25%的缓冲池页面在mysql关闭时存储到文件,但是你可以控制这个值 – 使用innodb_buffer_pool_dump_pct,建议75-100。 这个特性从MySQL 5.6才开始支持。 13.INNODB_ADAPTIVE_HASH_INDEX_PARTS 如果你运行着一个大量SELECT查询的MySQL服务器(并且已经尽可能优化),那么自适应哈希索引将下你的下一个瓶颈。自适应哈希索引是InnoDB内部维护的动态索引,可以提高最常用的查询模式的性能。这个特性可以重启服务器关闭,不过默认下在mysql的所有版本开启。 这个技术非常复杂,在大多数情况下它会对大多数类型的查询直到加速的作用。不过,当你有太多的查询往数据库,在某一个点上它会花过多的时间等待AHI锁和闩锁。 如果你的是MySQL 5.7,没有这个问题 – innodb_adaptive_hash_index_parts默认设置为8,所以自适应哈希索引被切割为8个分区,因为不存在全局互斥。 不过在mysql 5.7前的版本,没有AHI分区数量的控制。换句话说,有一个全局互斥锁来保护AHI,可能导致你的select查询经常撞墙。 所以如果你运行的是5.1或5.6,并且有大量的select查询,最简单的方案就是切换成同一版本的Percona Server来激活AHI分区。 14.QUERY_CACHE_TYPE 如果人认为查询缓存效果很好,肯定应该使用它。好吧,有时候是有用的。不过这个只在你在低负载时有用,特别是在低负载下大多数是读取,小量写或者没有。 如果是那样的情况,设置query_cache_type=ON和query_cache_size=256M就好了。不过记住不能把256M设置更高的值了,否则会由于查询缓存失效时,导致引起严重的服务器停顿。 如果你的MySQL服务器高负载动作,建议设置query_cache_size=0和query_cache_type=OFF,并重启服务器生效。那样Mysql就会停止在所有的查询使用查询缓存互斥锁。 15.TABLE_OPEN_CACHE_INSTANCES 从MySQL 5.6.6开始,表缓存能分割到多个分区。 表缓存用来存放目前已打开表的列表,当每一个表打开或关闭互斥体就被锁定 – 即使这是一个隐式临时表。使用多个分区绝对减少了潜在的争用。 从MySQL 5.7.8开始,table_open_cache_instances=16是默认的配置。 欢迎做Java的工程师朋友们私信我资料免费获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料) 其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。2023-08-04 09:19:211
abaqus中出现Dependent part instances connot be edited or assigned mesh attribute
独立的部分例子不能被编辑或不能指派网格属性2023-08-04 09:19:413
ThinkPHP容器之容器是如何返回实例的
“在之前的文章中我们简单的梳理了一下容器类,接下来就是对其中一个细节进行深度分析。”Container实例调用make方法本文没有太多文字解析,都在代码注释中说明了执行过程。代码static::getInstance()返回了Container的实例后,就会去调用本类的make方法,接下来就是对make方法进行详解了。在开始阅读make方法里边的源码之前,我们需要先对几个属性进行简单的梳理一下。这四个属性一定要有点印象,并且一定要区别instance和instances。这俩个属性一个是单例模式返回当前类的实例,一个是容器中的所有的实例。第一次执行结果 /** * 创建类的实例 * @access public * @param string $abstract 类名或者标识 * @param array|true $vars 变量 * @param bool $newInstance 是否每次创建新的实例 * @return object */ public function make($abstract, $vars = [], $newInstance = false) { // 判断$vars这个变量是否为true if (true === $vars) { // 总是创建新的实例化对象 $newInstance = true; $vars = []; } // app 这里就是在容器别名里获取传递过来的app 如果没有则就是app $abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract; // 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式 if (isset($this->instances[$abstract]) && !$newInstance) { return $this->instances[$abstract]; } // thinkApp 从容器标识中获取 if (isset($this->bind[$abstract])) { // 将thinkApp 复制给$concrete变量 $concrete = $this->bind[$abstract]; // 用于代表匿名函数的类 判断是不是闭包 if ($concrete instanceof Closure) { $object = $this->invokeFunction($concrete, $vars); } else { // $this->name["app"] = thinkApp $this->name[$abstract] = $concrete; // 在执行一次本类的make方法,也就是本方法 return $this->make($concrete, $vars, $newInstance); } } else { $object = $this->invokeClass($abstract, $vars); } if (!$newInstance) { $this->instances[$abstract] = $object; } return $object; }这是第二次执行流程 public function make($abstract, $vars = [], $newInstance = false) { // 判断$vars这个变量是否为true if (true === $vars) { // 总是创建新的实例化对象 $newInstance = true; $vars = []; } // app 这里就是在容器别名里获取传递过来的app 如果没有则就是app // 第二次执行时 $abstract = thinkApp $abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract; // 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式 if (isset($this->instances[$abstract]) && !$newInstance) { return $this->instances[$abstract]; } // thinkApp 从容器标识中获取 // 第二次执行$this->bind["thinkApp"]不存在走else if (isset($this->bind[$abstract])) { // 将thinkApp 复制给$concrete变量 $concrete = $this->bind[$abstract]; // 用于代表匿名函数的类 判断是不是闭包 if ($concrete instanceof Closure) { $object = $this->invokeFunction($concrete, $vars); } else { // $this->name["app"] = thinkApp $this->name[$abstract] = $concrete; // 在执行一次本类的make方法,也就是本方法 // thinkApp return $this->make($concrete, $vars, $newInstance); } } else { // thinkApp $object = $this->invokeClass($abstract, $vars); } if (!$newInstance) { // 把创建的容器存起来 //$this->instances["thinkApp"] = $object; $this->instances[$abstract] = $object; } return $object; }public function invokeClass($class, $vars = []) { try { /** * ReflectionClass Object ( [name] => thinkApp ) */ // 这里就是之前文章提到的反射 $reflect = new ReflectionClass($class); if ($reflect->hasMethod("__make")) { $method = new ReflectionMethod($class, "__make"); if ($method->isPublic() && $method->isStatic()) { $args = $this->bindParams($method, $vars); return $method->invokeArgs(null, $args); } } // 通过反射获取thinkApp的构造函数 $constructor = $reflect->getConstructor(); $args = $constructor ? $this->bindParams($constructor, $vars) : []; // 从给出的参数创建一个新的类实例 return $reflect->newInstanceArgs($args); } catch (ReflectionException $e) { throw new ClassNotFoundException("class not exists: " . $class, $class); } }执行流程图既然把代码都理清楚了,这时来理一下执行的流程图可以看的更清晰。“坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。”2023-08-04 09:19:491
如何用命名管道实现局域网上两台主机间的文件拷贝
能实现局域网上两台主机间文件拷贝的方法有很多种,这里介绍的“命名管道”(Named Pipe )是一种比较可靠的进程间通信机制,可用在同一台计算机不同进程间,也可用在不同计算机的不同进程间,可以是单向的,也可以是双向的,Windows NT、Windows 2000、Windows 95和Windows 98均提供了对它的支持,而且在Unix下也有类似的概念。它是在Microsoft LAN管理器和IBMLAN服务器网络操作系统上实现的。 命名管道使用了MSNP(微软网络提供者)重定向器,这样应用程序便可以不用了解网络协议的细节而利用该机制实现网络上的数据传输。它采用“命名管道文件系统”(Named Pipe File System)接口,其命名是采用UNC(通用命名规范)格式的: \ServerNamePipe[pipename] \ServerName指明命名管道是在那个服务器上创建的,ServerName既可以是一个实际的计算机名,也可以是小数点(“.”)以指明是在本机上创建;Pipe是一个硬编码(Hardcode)不用区分大小写的字符串用以指明这是一个管道名,该文件名从属于NPFS;[pipename]是实际的自定义的管道名,该名称在前面指定的服务器上必须是唯一的,该名称可以包含多级目录,但目录名必须不是已经创建的管道名,例: \.PipexyPipe"这是一个合法管道名 \.PipexyPipePipe"这不是一个合法的管道名,因为前面的目录\.PipexyPipe是一个已经创建的管道名了。 \.PipexxyPipePipe"这也是一个合法的文件名 命名管道有两种基本通信模式:字节模式和消息模式。在字节模式中,数据是以字节流的形式在管道种传输,数据之间没有边界,在管道写入和读出操作中是以字节流即数据块为基本单位操作的,这适合传输大容量数据;在消息模式中,数据是以一条条不连续的消息为基本传输单元,消息和消息之间有边界,在管道写入和读出操作中也是以消息为单位进行操作的,这种方式适合传输量小的数据。因为现在的文件大小常常有几百K甚至更大,所以程序中选择使用字节模式。 下面详细介绍一下CreateNamedPipe()这个函数,该函数C原型如下: HANDLE CreateNamedPipe( LPCTSTR lpName, // pointer to pipe name DWORD dwOpenMode, // pipe open mode DWORD dwPipeMode, // pipe-specific modes DWORD nMaxInstances, // maximum number of instances DWORD nOutBufferSize, // output buffer size, in bytes DWORD nInBufferSize, // input buffer size, in bytes DWORD nDefaultTimeOut, // time-out time, in milliseconds LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security attributes ); lpName:为前面所述的命名管道名。 dwOpenMode:为命名管道打开的模式,有PIPE_ACCESS_DUMPLEX(双向)、PIPE_ACCESS_INBOUND(输入)、PIPE_ACCESS_OUTBOUND(输出)这三种,这些标志还可以和一些附加的I/O控制和安全模式的常数组合使用,详细可参考MSDN。 dwPipeMode:为管道传输模式,有前面所述的PIPE_TYPE_BYTE(字节模式)和PIPE_TYPE_MESSAGE(消息模式)两种,可以和PIPE_READMODE_BYTE和PIPE_READMODE_MESSAGE常数组合使用以限定客户端的读取模式。可以使用PIPE_TYPE_MESSAGE 和 PIPE_READMODE_BYTE组合来指定发送者以消息模式向管道发送数据,而接收者一次可以读取任意数量的字节。注意不可将PIPE_TYPE_BYTE和PIPE_READMODE_MESSAGE组合使用,这样会导致CreateNamedPipe()函数调用失败,因为字节模式没有边界,在接收端用消息模式读取的时候无法判断消息的边界。 nMaxInstances:管道最大的连接实例句柄,其范围在1到255之间。 nOutBufferSize和nInBufferSize分别指明管道输出和输入缓冲区的大小,如设为0则使用系统默认大小。 nDefaultTimeOut以毫秒为单位设定客户机等待同命名管道建立连接的最长时间。 LpSecurityAttruibutes为一个安全描述符,设为Null表示使用系统默认的描述符,同时句柄不可继承。 要注意的是在程序中命名管道的写操作中一次最大只能写64K字节的数据, 下面是服务器端程序: (模块中): Public Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" (ByVal lpName As String, ByVal dwOpenMode As Long, ByVal dwPipeMode As Long, ByVal nMaxInstances As Long, ByVal nOutBufferSize As Long, ByVal nInBufferSize As Long, ByVal nDefaultTimeOut As Long, ByVal lpSecurityAttributes As Long) As Long Public Declare Function ConnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long, ByVal lplong As Long) As Long Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lplong As Long) As Long Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lplong As Long) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function WaitNamedPipe Lib "kernel32" Alias "WaitNamedPipeA" (ByVal lpNamedPipeName As String, ByVal nTimeOut As Long) As Long Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Public Declare Function DisconnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long) As Long Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long Public Const PIPE_ACCESS_DUPLEX = &H3 Public Const PIPE_ACCESS_INBOUND = &H1 Public Const PIPE_ACCESS_OUTBOUND = &H2 Public Const PIPE_CLIENT_END = &H0 Public Const PIPE_NOWAIT = &H1 Public Const PIPE_READMODE_BYTE = &H0 Public Const PIPE_READMODE_MESSAGE = &H2 Public Const PIPE_SERVER_END = &H1 Public Const PIPE_TYPE_BYTE = &H0 Public Const PIPE_TYPE_MESSAGE = &H4 Public Const PIPE_UNLIMITED_INSTANCES = 255 Public Const PIPE_WAIT = &H0 Public Const FILE_SHARE_READ = &H1 Public Const FILE_SHARE_WRITE = &H2 Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const GENERIC_EXECUTE = &H20000000 Public Const GENERIC_ALL = &H10000000 Public Const OPEN_EXISTING = 3 Public Const ERROR_PIPE_BUSY = 231& Public Const ERROR_PIPE_CONNECTED = 535& Public Const ERROR_PIPE_LISTENING = 536& Public Const ERROR_PIPE_NOT_CONNECTED = 233& Public Const ERROR_NO_DATA = 232& Public Const BufferSize& = 51200 Public hNamePipe&, hFile&, strNamePipe$ Form中有三个按钮,分别是“创建命名管道”(CreateNPipe)、“发送文件”(SendFile)、“关闭命名管道”(CloseNamePipe),窗口中还有一个CommonDialog控件,命名为“CDlg1”。Form中代码: Dim outBuffer() As Byte, inBuffer() As Byte, BytesRead As Long, BytesWrite As Long, BytesReaded As Long, BytesWrited As Long Private Sub CloseNamePipe_Click() DisconnectNamedPipe hNamePipe CloseHandle hNamePipe CreateNPipe.Enabled = True SendFile.Enabled = False CloseNamePipe.Enabled = False End Sub Private Sub CreateNPipe_Click() Dim hReturn& strNamePipe = "\.pipexyvanPipe" hNamePipe = CreateNamedPipe(strNamePipe, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE Or PIPE_READMODE_BYTE, 1, 0, 0, 0, 0) If hNamePipe <> -1 Then hReturn = ConnectNamedPipe(hNamePipe, 0) If hReturn = 0 Then MsgBox "管道无法等待客户端的连接!", vbInformation Or vbOKOnly Unload Me Else Label1 = "已同客户机连接上!" End If CreateNPipe.Enabled = False SendFile.Enabled = True CloseNamePipe.Enabled = True Else MsgBox "无法创建命名管道!", vbInformation Or vbOKOnly Unload Me End If End Sub Private Sub Form_Load() With CDlg1 .CancelError = True .DialogTitle = "请选择要传输的文件:" .filename = "" .Filter = "所有文件(*.*)|*.*" .Flags = cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNPathMustExist .InitDir = "d:" End With SendFile.Enabled = False CloseNamePipe.Enabled = False End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) DisconnectNamedPipe hNamePipe CloseHandle hFile CloseHandle hNamePipe End Sub Private Sub SendFile_Click() On Error Resume Next Dim strFileName$, lpFileSize&, lpFileSizeHigh&, lpFileSizeLeast&, byteEnd() As Byte Dim strShortName$ CDlg1.ShowOpen If Err.Number = 32755 Then Exit Sub strFileName = CDlg1.filename strShortName = CDlg1.FileTitle hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0) If hFile = -1 Then MsgBox "无法打开文件" & strFileName, vbInformation Or vbOKOnly Exit Sub End If lpFileSize = GetFileSize(hFile, lpFileSizeHigh) If lpFileSize = 0 Then MsgBox "该文件大小为零,不用发送!", vbInformation Or vbOKOnly CloseHandle hFile Exit Sub End If lpFileSizeLeast = lpFileSize byteEnd() = StrConv(strShortName, vbFromUnicode) ReDim outBuffer(UBound(byteEnd)) ByteCopy byteEnd, outBuffer WriteFile hNamePipe, byteEnd(0), UBound(byteEnd) + 1, BytesWrited, 0 "发送短文件名 ReDim inBuffer(5) ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0 "读取客户端对话信息 If StrConv(inBuffer, vbUnicode) = "Cancel" Then MsgBox "客户端保存时选择了取消,发送终止!", vbInformation Or vbOKOnly CloseHandle hFile Exit Sub End If Label1.Caption = "正在传输中…" While lpFileSize > 0 If lpFileSize > BufferSize Then ReDim outBuffer(BufferSize - 1) ReadFile hFile, outBuffer(0), BufferSize, BytesReaded, 0 WriteFile hNamePipe, outBuffer(0), BytesReaded, BytesWrited, 0 Else ReDim outBuffer(lpFileSize - 1) ReadFile hFile, outBuffer(0), lpFileSize, BytesReaded, 0 WriteFile hNamePipe, outBuffer(0), lpFileSize, BytesWrited, 0 End If lpFileSize = lpFileSize - BytesReaded ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0 Wend byteEnd() = StrConv("EOF", vbFromUnicode) ReDim outBuffer(UBound(byteEnd)) ByteCopy byteEnd, outBuffer WriteFile hNamePipe, outBuffer(0), 3, BytesWrited, 0 CloseHandle hFile Label1 = "传送文件完毕!" End Sub Public Sub ByteCopy(bySrc() As Byte, byDes() As Byte) Dim I As Long For i = LBound(bySrc) To UBound(bySrc) byDes(i) = bySrc(i) Next End Sub 剩下的你加我QQ我发肥你给你839890242023-08-04 09:19:571