我创建了一个使用自然排序("1" <"2" <"10" <"11"等),用我的新运营商的文本数据类型我自己比较运营商#<#
,#<=#
,#>#
和#>=#
.
现在我将它们放入一个运算符类中,以便能够在它们上创建索引,如下所示:
CREATE OPERATOR CLASS text_natsort_ops
FOR TYPE text USING btree AS
OPERATOR 1 #<#,
OPERATOR 2 #<=#,
OPERATOR 3 =,
OPERATOR 4 #>=#,
OPERATOR 5 #>#,
FUNCTION 1 bttext_natsort_cmp(text, text);
Run Code Online (Sandbox Code Playgroud)
然而,当我创建一个使用我的新的指数text_natsort_ops
,在此不涉及查询中使用like
,因为它的时所做的text_pattern_ops
使用.
如何声明我的运算符类以允许like
使用我的索引?
更新:
以上似乎有效,所以问题无效.我真正的问题是我使用了如下查询:
select *
from mytable
where number like 'edi%'
order by number using #<#
limit 10
Run Code Online (Sandbox Code Playgroud)
我还有另一个使用text_pattern_ops的索引,这是由计划者选择的,因为它似乎工作得更快.但是,由于order by ... using
只使用我的新操作的索引将是有用的...另一个索引返回太多结果,我需要限制子句可用于索引扫描.
我想知道是否有一些方法让64位VM使用8byte对象头而不是12byte对象头,如果JVM的可用RAM仍然是4GB.
或者就像在Linux上那样,如果没有在Windows上?有人可以用这段代码测试吗?
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class ObjectSizes {
String s1;
String s2;
public static void main(String[] args) throws Exception {
Unsafe unsafe;
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe)field.get(null);
} catch (Exception ex) {
throw new RuntimeException("Can't get Unsafe instance.", ex);
}
Field s1Field = ObjectSizes.class.getDeclaredField("s1");
Field s2Field = ObjectSizes.class.getDeclaredField("s2");
long s1OffSet = unsafe.objectFieldOffset(s1Field);
long s2OffSet = unsafe.objectFieldOffset(s2Field);
System.out.println("We are running "+System.getProperty("java.version"));
System.out.println("Object header size is "+s1OffSet+" bytes.");
System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes.");
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取有关系统上打印机的一些信息.
在Windows和Linux上,使用此代码,仅PrinterName
填充属性:
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null,null);
for( PrintService printService : printServices ) {
log.info("Found print service: "+printService);
log.info(printService.getAttribute(PrinterName.class));
log.info(printService.getAttribute(PrinterLocation.class));
log.info(printService.getAttribute(PrinterMakeAndModel.class));
log.info(printService.getAttribute(PrinterMessageFromOperator.class));
log.info(printService.getAttribute(PrinterMoreInfo.class));
log.info(printService.getAttribute(PrinterMoreInfoManufacturer.class));
log.info(printService.getAttribute(PrinterState.class));
log.info(printService.getAttribute(PrinterStateReasons.class));
log.info(printService.getAttribute(PrinterURI.class));
}
Run Code Online (Sandbox Code Playgroud)
使用toArray()
它后的功能......
log.info("Found print service: "+printService);
for( Attribute a : printService.getAttributes().toArray() ) {
log.info("* "+a.getName()+": "+a);
}
Run Code Online (Sandbox Code Playgroud)
......这是结果:
Found print service: Win32 Printer : Brother MFC-9420CN BR-Script3 * color-supported: supported * printer-name: Brother MFC-9420CN BR-Script3 * printer-is-accepting-jobs: accepting-jobs * queued-job-count: 0
如何获取更多信息,例如打印机评论?
我构建了一个打开ServerSocket的简单应用程序,在连接时,它将自身连接到远程计算机上的另一个服务器套接字.为了实现端口转发,我使用两个线程,一个从本地输入流读取并流到远程套接字输出流,反之亦然.
实现感觉有点无法实现,所以我问你是否知道更好的实现策略,或者甚至有一些代码可以以高效的方式实现.
PS:我知道我可以在Linux上使用IPTables,但这必须在Windows上运行.
PPS:如果你发布这个简单任务的实现,我将创建一个基准来测试所有给定的实现.对于许多小型(~100字节)包和稳定数据流,解决方案应该是快速的.
我当前的实现是这样的(在每个方向的两个线程中执行):
public static void route(InputStream inputStream, OutputStream outputStream) throws IOException {
byte[] buffer = new byte[65536];
while( true ) {
// Read one byte to block
int b = inputStream.read();
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close();
return;
}
buffer[0] = (byte)b;
// Read remaining available bytes
b = inputStream.read(buffer, 1, Math.min(inputStream.available(), 65535));
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close(); …
Run Code Online (Sandbox Code Playgroud) 如何更改TabFolder中现有TabItem的顺序?很抱歉无法发布更多内容,但我完全没有任何线索.TabItems没有z-Index,所包含的合成的moveAbove()和moveBelow()不起作用,我有尝试一切的感觉.
问候,丹尼尔
我正在为SWT实现甘特图组件,这需要重新绘制一下(例如,图表的整个可见部分为200毫秒).
现在,当我滚动时,我只重新绘制剪切矩形所需的内容.当我快速滚动时,这使得应用程序看起来非常糟糕,因为滚动后仍然可见的部分似乎首先被操作系统移动,并且当我完成绘制剩余部分(滚动期间变得可见的部分)时,立即显示新的滚动步骤开始,将我的图表的一半移到右边,让我重新绘制另一半.这实际上看起来像我的图表在滚动期间在中间闪烁.
这看起来不太好看.有办法解决这个问题吗?这个问题可以理解吗?
编辑:这是一个"小"测试程序,准确显示所描述的行为.您只需要在类路径中使用SWT来运行它.
package de.ikoffice.gui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SlowRepaintProblem {
public Color[] colors = new Color[501];
public SlowRepaintProblem() {
Display display = Display.getDefault();
for( int i=0; i<=500; i++ ) {
int r = ( i * 10 ) % 256;
int g = ( i * 20 ) % 256;
int b = …
Run Code Online (Sandbox Code Playgroud) 我刚刚阅读了PostgreSQL文档 - 触发器行为概述,BEFORE触发器比AFTER触发器"更有效":
如果您没有特定的理由在之前或之后进行触发,则之前的情况更有效,因为有关操作的信息不必保存到语句结束之前.
我不明白这是真的还是对我来说意味着什么.有人可以开导我吗?这只是一种逆转性能改善吗?
我正在使用JUnit4并在测试套件中组织我的所有测试,并使用@RunWith(Suite.class)注释进行注释.
现在我想向JUnit注册一个自定义记录器,因此在每次测试的每个开始和完成时都会打印一条日志消息.
我已经找到了RunNotifier和RunListener类,但不知道如何将我的TestSuite定义中的监听器添加到JUnit.
有任何想法吗?
我有一些字节应该是UTF-8编码,但其中可能包含文本是ISO8859-1编码,如果用户以某种方式没有设法使用他的文本编辑器正确的方式.
我用InputStreamReader读取文件:
InputStreamReader reader = new InputStreamReader(
new FileInputStream(file), Charset.forName("UTF-8"));
Run Code Online (Sandbox Code Playgroud)
但是每次用户使用像ä"这样的变音符号时,如果存储在ISO8859-1中是无效的UTF-8,则InputStreamReader不会抱怨但会添加占位符字符.
是否有简单的方法使这个无效输入抛出异常?
只是想知道,如果压缩jar文件一般是一个好主意,这些文件将与桌面应用程序一起发送(没有网络访问jar),如果解压缩将比文件io具有更大的影响.
编辑:谢谢你到目前为止的答案,并抱歉在这里有点不清楚.我没有谈到将罐子运送给客户,而是在应用程序启动时将磁盘上的jar文件的最佳格式.我知道jar文件是zip文件,可以提供不同的压缩级别(或根本没有压缩),我直接想知道压缩如何改变启动性能,不仅仅是在我的开发盒上(其中有一个快速的SSD磁盘) ,但也在较慢的磁盘上).